Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4911691
  • 博文数量: 1165
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 14018
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
  • 认证徽章:
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1165)

文章存档

2019年(141)

2018年(81)

2017年(80)

2016年(70)

2015年(52)

2014年(41)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(288)

分类: 其他平台

2019-06-28 14:39:43

STL的头文件不再使用常规的 .H 扩展, 避免和其他头文件冲突.

扩展的容器类还有 multimap  multiset priority_queue

常用容器
队列容器:  vector deque list
关联容器:  set  map

vector : 
   动态数组, 是基本数组的类模板. 
   vector vi; //初始长度为0的空向量
   vector vi(init_size, 0);  //init_size可以用const预定义, 0为初始化值.
   vector v3(v2); //复制构造函数, 完全复制.
   vector v4(first,last); //产生初始值为一个区间的向量. 包括first, 不包括last

   迭代
   for (int i=0; iconst_iterator或者iterator 
it=vi.begin(); it!=vi.end(); ++it)  *p=xxx;
  1. #include
    #include
    #include
    using namespace std;


    int iArr[10] = {1,23,4,56,7,89,0,12,3,1}; 
    char* szArr = "Hello World";


    int main(void)
    {
      vector vec0(3, 0);
      vector vec1(iArr, iArr+10);  //vec1 的内容为 "1 23 4 56 7 89 0 12 3 45"
      vector vec2(szArr, szArr+strlen(szArr)); //vec2 的内容为 "H e l l o   W o r l d"


      if (vec1[9] == vec1.at(9)) {
        cout << "vec1[9] == vec1.at(9) --> " << vec1[9] <<  " == " << vec1.at(9) << endl;
        //打印 vec1[9] == vec1.at(9) --> 1 == 1
      }


      if (vec1.front() == vec1.back()) {
        cout << "vec1.front() == vec1.back() --> " << vec1.front() <<  " == " << vec1.back() << endl;
        //打印 vec1.front() == vec1.back() --> 1 == 1
      }


      //vec1.insert(vec1.begin()+1, vec0.begin(), vec0.end()); //此时vec1为 "1 0 0 0 23 4 56 7 89 0 12 3 45"
      //vec1.erase(vec1.begin()+1, vec1.end()-2); //此时变成 " 1 3 1 ", 即保留第一个元素, 后面保留两个元素
      //vec1.assign(4, 888); //把vec1重新定义成 4个元素, 每个元素的初始值为 888
      //vec1.pop_back(); //删除最后一个元素


      for (vector::const_iterator p=vec1.begin(); p!=vec1.end(); ++p)
        cout << *p << " ";
      cout << endl;


      for (vector::const_iterator p=vec2.begin(); p!=vec2.end(); ++p)
        cout << *p << " ";
      cout << endl;


      return 0;
    }
其他api如
vi.push_back(2) //把2元素放到vi的后面
vi.insert(vi.begin()+1, 2); //把2元素放到vi的第一个位置上.
vi.insert(vi.begin()+1, v3.begin(), v3.end()); //在vi第一的位置上开始插入v3的所有成员.

vi.assign(8,1); //给vi重新赋值, 8个成员的初始值都为1.
vi.front() ; //vi的第0个成员
vi.back(); //vi最后一个成员.
vi.at(4); //vi的第5个成员.
vi[4]; //vi的第5个成员.
vi.size();//vi的成员个数
vi.empty(); //判断成员是否为空.


vi.pop_back(); //把最后一个成员移除
vi.erase(vi.begin()+1, vi.end()-2); //删除成员


deque : double queue.  支持随机访问和快速插入删除, 在容器的某个位置上花费的时间为线性时间. 同时支持开始断插入数据API. push_front(); 不支持capacity() 和 reserve(). 
其他操作和 vector 相同.

list 是双线性列表, 只能顺序访问(从前到后, 或者从后到前), 不支持随机访问, 不能用下标[]操作符.
但仍然有 erase() insert() push_back() push_front()操作.
特有的
sort();  排序列表
merge()  合并两个排序 list
splice()  拼接两个 list , 将元素从x转移到当前容器中,并将其插入对应位置。效果是X容器中对应的元素被移除, 目标容器的内容被加入. 从而改变了两个容器的大小.
entire list (1)
void splice (const_iterator position, list& x);
void splice (const_iterator position, list&& x);
single element (2)
void splice (const_iterator position, list& x, const_iterator i);
void splice (const_iterator position, list&& x, const_iterator i);
element range (3)
void splice (const_iterator position, list& x, const_iterator first, const_iterator last);
void splice (const_iterator position, list&& x, const_iterator first, const_iterator last);


  1. #include <iostream>
  2. #include <list>

  3. int main ()
  4. {
  5.   std::list<int> mylist1, mylist2;
  6.   std::list<int>::iterator it;

  7.   // set some initial values:
  8.   for (int i=1; i<=4; ++i)
  9.      mylist1.push_back(i); // mylist1: 1 2 3 4

  10.   for (int i=1; i<=3; ++i)
  11.      mylist2.push_back(i*10); // mylist2: 10 20 30

  12.   it = mylist1.begin();
  13.   ++it; // points to 2

  14.   //整体转移
  15.   mylist1.splice (it, mylist2); // mylist1: 1 10 20 30 2 3 4
  16.                                 // mylist2 (empty) 整个被转移了.
  17.                                 // "it" still points to 2 (the 5th element)
  18.   //转移一个
  19.   mylist2.splice (mylist2.begin(), mylist1, it);
  20.                                 // mylist1: 1 10 20 30 3 4
  21.                                 // mylist2: 2
  22.                                 // "it" is now invalid.
  23.   it = mylist1.begin();
  24.   //将迭代器向前移动n个元素位置
  25.   std::advance(it,3); // "it" points now to 30

  26.   //转移一批.
  27.   mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
  28.                                 // mylist1: 30 3 4 1 10 20

  29.   std::cout << "mylist1 contains:";
  30.   for (it=mylist1.begin(); it!=mylist1.end(); ++it)
  31.     std::cout << ' ' << *it;
  32.   std::cout << '\n';
  33.   //mylist1 contains: 30 3 4 1 10 20

  34.   std::cout << "mylist2 contains:";
  35.   for (it=mylist2.begin(); it!=mylist2.end(); ++it)
  36.     std::cout << ' ' << *it;
  37.   std::cout << '\n';
  38.   //mylist2 contains: 2

  39.   return 0;
  40. }







阅读(141) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册