1. 内置基本数据结构
1.1 动态数组(vector)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
const unsigned int INIT_SIZE = 5;
vector<int> vc(INIT_SIZE,0);//定义一个大小为5的vector,并初始化为0
for(unsigned int i=0;i<vc.size();i++) vc[i] = i; //更新vc的值
//C++11使用auto关键字遍历
for(auto x:vc){
cout<<x<<endl;
}
vc.clear();//清除所有的元素
vc.push_back(666);//在尾部增加一个值
cout<<vc.back()<<endl;//获取尾部的值
vc.pop_back();//弹出尾部的值
//使用迭代器进行遍历
vector<int>::iterator it;
for(it=vc.begin();it!=vc.end();it++){
cout<<*it<<" ";
}
return 0;
}
1.2. 链表(list)
#include<iostream>
#include<list>
using namespace std;
// 在第m个元素后插入
void indexInsert(list<int> &l, int m, int num)
{
auto iter = l.begin();
for (int i = 0; i < m; i++) {
iter++;
}
l.insert(iter, num);
}
// 删除第m个元素
void indexDelete(list<int> &l, int m)
{
if(!l.empty()){
auto iter = l.begin();
for (int i = 0; i < m - 1; i++) {
iter++;
}
l.erase(iter);
}
}
int main()
{
list<int>l1;
list<int>l2(2,0);
l1.push_back(1);//尾部插入
l1.push_front(2);//头部插入
l1.pop_back();//尾部弹出
l2.pop_front();//头部弹出
cout<<l1.front()<<" "<<l2.back()<<endl;
//使用迭代器进行遍历
list<int>::iterator it;
for(it = l1.begin();it!=l1.end();it++){
cout<<*it<<" ";
}
cout<<endl;
l1.reverse();//完成list的逆置
l1.swap(l2);//将l1和l2交换
l1.merge(l2);//合并两个链表
l2.clear();//清空链表
l2.resize(10,0);//新增0填满到长度10
if(!l1.empty())
l1.assign(l2.begin(),l2.end());
for(auto x:l1)//C++11使用auto关键字遍历
cout<<x<<" ";
return 0;
}
1.3. 队列(queue)
#include<iostream>
#include<queue>
using namespace std;
int main()
{
queue<int> q;
if(q.empty()) q.push(1);
if(!q.empty())q.pop();//弹出队头元素
else q.push(2);//此处不会被执行
cout<<q.size()<<endl;//输出队列大小,此时队列为空
cout<<q.front()<<endl;//返回队头,即最早被压入队列的元素,此处为初始化随机值
cout<<q.back()<<endl;//返回队尾,即最后被压入队列的元素,此处为1,因为只进行一次入列操作
return 0;
}
1.4. 栈(stack)
#include<iostream>
#include<stack>
using namespace std;
int main()
{
stack<int> s;
if(s.empty()) s.push(1);
if(!s.empty())s.pop();//弹出队头元素, 注意没有返回值,只是单独弹出
else s.push(2);//此处不会被执行
cout<<s.size()<<endl;//输出队列大小,此时队列为空
cout<<s.top()<<endl;//返回栈顶,此时为空故无值返回
return 0;
}
1.5. 映射(map)
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<int,string> mapStudent;//定义一个map对象
/*如果key存在则插入失败*/
mapStudent.insert(pair<int,string>(000,"student_zero"));//map插入键值对
mapStudent.insert(map<int,string>::value_type(001,"student_first"));//
/*用数组的方式插入可以覆盖key*/
mapStudent[001] = "student_first_plus";
cout<<mapStudent[001]<<endl;//通过下标进行元素访问
map<int,string>::iterator it;
it = mapStudent.find(000);//返回的是一个迭代器
cout<<it->first<<it->second<<endl;//it->first是键,it->second是值
mapStudent.erase(it);//用迭代器进行删除
int n = mapStudent.erase(001);//直接通过key进行删除,成功返回1,否则返回0
cout<<n<<endl;
mapStudent.clear();//清除
mapStudent.erase(mapStudent.begin(),mapStudent.end());//范围删除
if(mapStudent.empty()){
for(unsigned int i=0;i<5;i++)
mapStudent[i] = "god";
}
int l = mapStudent.size();
int m = mapStudent.count(1);//参数是键,不是值
cout<<l<<endl;//输出map的大小
cout<<m<<endl;//输出值的出现的次数,由于不会重复,所有只能是0或者1
return 0;
}
1.6. 集合(set)
#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> s;
for(unsigned i=0;i<5;i++){
s.insert(i);
}
set<int>::iterator it;
//通过迭代器遍历集合
for(it=s.begin();it!=s.end();++it){
cout<<*it<<endl;
}
it = s.find(2);
cout<<"2的定位是:"<<*it<<endl;
cout<<"set 的 size 值为 :"<<s.size()<<endl;
cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;
cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;
s.erase(1);//删除键值key_value的值
s.erase(s.begin(),s.end());//范围删除
s.clear();//清空集合
if(s.empty()){
cout<<"set is empty!"<<endl;
}
cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl;
return 0;
}
2. 参考资料
[2] C++中list用法详解
[3] C++ 标准模板库STL 队列 queue 使用方法与应用介绍
[5] C++ map用法总结(整理)
[6] C++中set用法详解