C++STL容器

来源:互联网 发布:知乎专栏名字 编辑:程序博客网 时间:2024/05/01 22:10

序列式容器(随机存储)
vector:
(1)vector<int> vec1;
        vec1.push_back(1);
        vec1.push_back(2);
    vec1.push_back(3);  //尾部插入元素
    int n = vec1[0]; // vector和deque可以这样读取元素
(2)vector<int> vec2(10,8);//10个8
(3)int array[] = {1,2,3,4,5};
        vector<int> vec3(array,array+5);
        vector<int>::iterator ifirst,iend;
        ifirst = vec3.begin();
        iend = vec3.end();
       vec3.insert(ifirst+3,9); // vec3的元素为1,2,3,9,4,5
      //或vec3.insert(vec3.begin()+3,9);
        ifirst++;
        int n = *ifirst; //n为2
    vec3.pop_back();  //vec3的元素为1,2,3,9,4
       vec3.erase(vec3.begin()); // vec3的元素为2,3,9,4
        vec3.erase(vec3.begin(),vec3.end()); //清空
        //或vec3.clear();
(4)vector<int> vec4(vec1);
    //或vec4 = vec1;
        vector<int>::reverse_iterator rifirst,riend;
        riend = vec4.rend();
        for (rifirst = vec4.rbegin();rifirst!=riend;rifirst++)//反向找逐个输出
        {
              cout<<*rifirst<<endl;
        }
     vec4.swap(vec3); //交换
   //或swap(vec4, vec3);
deque双向队列:
创建deque对象参考上面vector。
deque<int> deq1;
deq1.push_back(1);
deq1.push_back(2);
插入元素参考上面vector,同时deque还有自己的函数:
deq1.push_front(3);
int n = deq1[0];  // vector和deque可以这样读取元素

删除元素参考vector,同时deque还有自己的函数:
deq1.pop_front();//删除第一个元素
list双向链表:
元素插入参考deque
list<int> lis;
lis.push_back(1);
lis.push_back(2);
lis.push_front(3); //此时lis中的元素为 3,1,2
list<int>::iterator ifirst, iend;
ifirst = lis.begin();
ifirst ++;
int n = *ifirst; //n为1
iend = lis.end();
iend--; //记住要得到最后一位先要--
n = *iend // n为2
注:和deque不同,list读取元素要通过迭代器,不能直接通过n = lis[1]这种方式来取得
删除元素参考deque,同时list还有自己的函数:
int array[] = {1,2,2,3,4,2,5};
list<int> lis2(array, array+7);
lis2.remove(2); //此时lis2中的元素为1,3,4,5
删除相邻的相同元素:
int array[] = {1,2,2,3,4,2,5};
list<int> lis3(array, array+7);
lis3.unique(); //此时lis3中的元素为1,2,3,4,2,5
排序:int array[] = {10,2,7,3,4,8,5};
list<int> lis4(array, array+7);
lis4.sort(); //此时lis4中的元素为2,3,4,5,7,8,10
list<int> lis5;
lis5.push_back(9);
lis5.push_back(6);
list<int>::iterator nn;
nn = lis5.begin();
nn++;
lis5.splice(nn, lis4, lis4.begin());//lis5中的元素为9,2,6 lis4中元素为3,4,5,7,8,10
lis5.splice(nn, lis4);//lis中的元素为9,3,4,5,7,8,10,2,6  lis4中的元素为空
lis5.sort(); //2,3,4,5,6,7,8,9,10
list<int> lis6;
lis6.push_back(1);
lis6.push_back(11);
lis5.merge(lis6);//lis5为1,2,3,4,5,6,7,8,9,10,11  lis6为空
注意:lis5和lis6都必须按从小到大排序
stack堆栈:
stack<int> stac;
stac.push(3); //入栈
stac.push(2);
stac.push(4);
while (!stac.empty())
{    
cout<<stac.top()<<endl; //输出顺序为4,2,3
       stac.pop(); //出栈    
}
queue队列:
queue<int> que;
que.push(3); //入队
que.push(2);
que.push(4);
while (!que.empty())
{  
cout<<que.front()<<endl; //输出顺序为3,2,4
       que.pop(); //出队    
}

关联式容器(按顺序进行存储)
set
set<int>s;
s.insert(10);
s.insert(3);
s.insert(5); //s中的元素为3,5,10
pair<set<int>::iterator,bool>p=s.insert(2);
if (!p.second)
{
       MessageBox("该元素已经存在");
}
删除元素参考上面,同时set还有自己的函数:
s.erase(3);//删除值为3的项
搜索元素:
set<int>::iterator sfind = s.find(5); //sfind指向元素为5的项
multiset允许有相同的键值项
map:
set可以看成是一种特殊的map,其键值和实值是相同的。

pair<char*, int> p1("beijing",5);
pair<char*, int> p2("tianjin",9);
pair<char*, int> p3("shanghai",6);
map<char*,int> ma;
ma.insert(p1);
ma.insert(p2);
ma.insert(p3);
map<char*, int>ma2(ma);
ma["shijiazhuang"]=10;
//添加项
ma.erase("shijiazhuang");
map<char*,int>::iterator imap;
imap = ma.find("beijing");
char *pch = (*imap).first; //pch指向"beijing"
int n = (*imap).second; //n为5
multimap允许键值重复,一个键值可与多个元素联系