C++ STL之容器的基本操作

注意事项:
特别注意任何时候同时使用两个迭代器产生的将会是一个前闭后开的区间(具体见插入和删除的例子)
特别注意begin()指向的是vec中的第0个元素,而end是指向最后一个元素的后面一个位置(不是最后一个元素)
特别注意迭代器的时效性,如果一个迭代器所指向的内容已经被删除,而后又使用该迭代器的话,会造成意想不到的后果

  1 //容器的基本操作
  2 //特别注意任何时候同时使用两个迭代器产生的将会是一个前闭后开的区间(具体见插入和删除的例子)
  3 //特别注意begin()指向的是vec中的第0个元素,而end是指向最后一个元素的后面一个位置(不是最后一个元素)
  4 //特别注意迭代器的时效性,如果一个迭代器所指向的内容已经被删除,而后又使用该迭代器的话,会造成意想不到的后果
  5 #include<iostream>
  6 #include<vector>
  7 #include<algorithm>
  8 using namespace std;
  9 void print(vector<int> vec)
 10 {
 11     for(int i=0;i<vec.size();i++)
 12     {
 13         cout<<vec[i]<<" ";
 14     }
 15     cout<<endl;
 16 }
 17
 18 int main()
 19 {
 20     //初始化,一般序列式容器初始化容量、内容,关联式容器初始化比较方法
 21     int num[10]={0,1,2,3,4,5,6,7,8,9};
 22     vector <int> vec(num,num+10);
 23     print(vec);
 24
 25     //增加元素insert(要使用迭代器,在迭代器的指定位置插入数据,注意与string区分)、push
 26     //特别注意如果使用两个迭代器产生的将会是一个前闭后开的区间
 27     vector<int>::iterator iter_int;
 28     //在第二个元素(vec[1])的位置上插入99
 29     iter_int=vec.begin()+1;
 30     vec.insert(iter_int,99);
 31     cout<<"在第二个元素(vec[1])的位置上插入99"<<endl;
 32     print(vec);
 33     //在第三个元素(vec[2])的位置上插入3个100
 34     iter_int=vec.begin()+2;
 35     vec.insert(iter_int,3,100);
 36     cout<<"在第三个元素(vec[1])的位置上插入三个100"<<endl;
 37     print(vec);
 38     vector<int>temp(num,num+10);
 39     cout<<"temp:"<<endl;
 40     print(temp);
 41     vector<int>::iterator t1=temp.begin()+1;
 42     vector<int>::iterator t2=temp.begin()+3;
 43     vec.insert(vec.begin(),t1,t2);
 44     cout<<"在第1个元素(vec[0])的位置上插入temp的[1,3)后的vec:";
 45     print(vec);
 46
 47     cout<<"push插入操作"<<endl;
 48     vec.push_back(100);
 49     print(vec);
 50
 51     //删除元素erase、clear(全删除)
 52     //特别注意如果使用两个迭代器产生的将会是一个前闭后开的区间
 53     iter_int=vec.begin();
 54     vec.erase(iter_int,iter_int+5);
 55     cout<<"删除操作,删除[0,5)区间的内容"<<endl;
 56     print(vec);
 57
 58     //查找操作(序列式容器没有查找操作,只有关联式容器采用)
 59
 60     //修改元素,修改元素先查找要修改的元素,如果查找返回引用则直接对引用进行修改,如果返回的是迭代器,需要使用迭代器的方法修改元素的值
 61     cout<<"修改元素操作"<<endl;
 62     vec[0]=8;//[]返回的是引用,所以直接操作
 63     print(vec);
 64     iter_int=vec.begin();
 65     *iter_int=9;//迭代器需要使用迭代器的方法修改元素的值
 66     print(vec);
 67
 68     //和指定容器交换元素swap
 69     cout<<"交换内容"<<endl;
 70     vector <int> vec1(num,num+10);
 71     cout<<"交换前的元素vec:";
 72     print(vec);
 73     cout<<"交换前的元素vec1:";
 74     print(vec1);
 75     vec1.swap(vec);
 76     cout<<"交换后的元素vec:";
 77     print(vec);
 78     cout<<"交换后的元素vec1:";
 79     print(vec1);
 80
 81     //容器之间可以比较,与string的比较一样
 82     if(vec>vec1)
 83     {
 84         cout<<"vec>vec1"<<endl;
 85     }
 86     else
 87     {
 88         cout<<"vec<=vec1"<<endl;
 89     }
 90
 91     //排序
 92     cout<<"对vec1排序"<<endl;
 93     iter_int=vec1.begin();
 94     sort(iter_int,iter_int+vec1.size());
 95     print(vec1);
 96
 97     //begin() end()
 98     //要特别注意begin()指向的是vec中的第0个元素,而end是指向最后一个元素的后面一个位置(不是最后一个元素)
 99     cout<<"begin and end"<<endl;
100     iter_int=vec1.begin();
101     cout<<*iter_int<<endl;
102     iter_int=vec1.end()-1;//如果写成这样就错了iter_int=vec1.end();
103     cout<<*iter_int<<endl;
104     return 0;
105 }

时间: 2024-10-26 20:15:24

C++ STL之容器的基本操作的相关文章

C++ STL vector容器学习

STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector,list, deque, set, map等),算法完成特定任务,迭代器用来遍历容器对象,扮演容器和算法之间的胶合剂. 模板类vector 在计算中,矢量(vector)对应数组,它的数据安排以及操作方式,与array非常类似.在C++中,使用vector模板类时,需要头文件包含#include<v

基于内存查看STL常用容器内容

有时候在线上使用gdb调试程序core问题时,可能没有符号文件,拿到的仅是一个内存地址,如果这个指向的是一个STL对象,那么如何查看这个对象的内容呢? 只需要知道STL各个容器的数据结构实现,就可以查看其内容.本文描述了SGI STL实现中常用容器的数据结构,以及如何在gdb中查看其内容. string string,即basic_string bits/basic_string.h: mutable _Alloc_hider _M_dataplus; ... const _CharT* c_s

Effective STL --关联容器

高效STL-关联容器 标准关联容器中最重要的就是基于等价而不是相等.比如对于基本的函数库有find函数,但是对于set关联容器也是有find成员函数的.因为标准关联容器保持有序,所以每一个容器必须有一个定义了怎么保持东西有序的比较函数(默认是less).等价是根据这个比较函数定义的,所以标准关联容器的用户只需要为他们要使用的任意容器指定一个比较函数 必须为指针的关联容器指定比较类型 一定要明确对于一个容器来说,容器内的迭代器是存入该容器对象的指针,比如一个关联容器存入指针类型,那么使用这个容器的

STL的容器算法迭代器的设计理念

1) STL的容器通过类模板技术,实现数据类型和容器模型的分离. 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了统一性. 3) STL的函数对象实现了自定义数据类型的算法运算 核心思想:其实函数对象本质就是回调函数,回调函数的思想,就是任务的编写者和任务的调用者有效解耦合,函数指针做函数参数. 4) 具体例子:transform算法的输入,通过迭代器first和last指向的元算作为输入:通过result作为输出:通过函数对象来做自定义数据类型的运算. 版权声明:本文为

stl string 容器的使用

string 是基本的字符串序列容器,对应数据结构中的串,和vector<char>也类似,但功能更多 string 容器的使用 1,string 的构造函数是. string() 2,string的添加函数,.   insert(),push_back() 3,string的遍历.      数组形式遍历,迭代器形式遍历 4,string的字符串替换  replace() 5,string 的字符搜索 find() 6,其他的常见函数 size(),length(),empty() #inc

c++ stl deque容器

c++中,Deque容器和vector相似,deque内部也采用动态数组来管理元素,支持随机存取..头文件<deque> 1.deque和vector的不同之处: 1)两端都可以较快速地按插元素和删除元素,而vector只能在尾端进行 2)在对内存有所限制的系统中,deque可以包含更多的元素,因为它不止一块内存.因此deque的max_size()可能更大 3)deque不支持对容量和内存的重分配时机的控制. 4)deque的内存区块不再被使用时,会被释放.deque的内存大小是可缩减的,由

STL中容器的push()或者push_back()函数的一点说明

在STL的queue 或者 vector.list等容器适配器或者容器中,会经常用到的函数就是push()或者push_back()函数,但是有一点需要明确的是: 在使用这些函数对容器/适配器对象增加新元素的时候,实际上是对原有的元素对象复制重新新建了一个元素对象作为元素压入到容器/适配器对象中. 例如: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include<queue> #include<iostream> u

顺序容器和关联容器的特点&amp;STL各容器粗略对比

顺序容器和关联容器的特点1.所有的关联容器都会自动排序,但map和set不允许重复元素,而multimap和multiset允许重复元素 2.关联容器中,map和multimap的key和val是分开的,而set和multiset的key和val是相同的 3.除了vector和deque的迭代器为随机迭代器之外,其余容器的迭代器都是双向迭代器,不能进行++操作 4.顺序容器的insert函数的三种形式为: iterator insert(iterator position, value_type

浅析常用STL中容器插入数据失败

昨天在上班的时候,碰到一个问题,关于 STL常用容器插入数据失败. 问题详细:在一个类构造函数填零后,那么map list 插入数据失败了,但是vector不会.测试代码如下: class Test { public: Test(){memset(this,0,sizeof(*this));} void InsertElement(){m_map.insert(std::make_pair(1,1)); } void InsetElement_vector(){ m_vector.push_ba