首页 > 代码库 > 顺序容器(二)--《C++ primer》
顺序容器(二)--《C++ primer》
前面已经简单介绍了顺序容器的定义以及一些操作,包括(添加,删除等),下面主要集中以代码的形式简单介绍一下相关用法,首先创建并初始化vector对象,一般有两大类:
1、分配指定数目元素,并初始化(分两种)
vector<int> ivec(10);
vector<int> ivec(10,1);
2、把vecotr对象初始化为一段元素的副本
int a[10]={1,2,3,4,5,6,7,8,9,10};
vector<int> ivec(a,a+10);
把vector对象初始化为另一对象的副本
vector<int> ivec1(10,1);
vector<int> ivec2(ivec1);
例如:
#include <iostream> #include <vector> #include <string> using namespace std; int main(){ int a[10]={1,2,3,4,5,6,7,8,9,10}; vector<int> kvec(a,a+8); //vector<int> ivec(10,1); //vector<int> kvec(ivec); for(vector<int>::iterator st=kvec.begin();st!=kvec.end();++st) cout <<*st <<' '; cout << endl; return 0; }
swap(c1,c2)属于赋值运算,交换c1,c2的元素,前提时c1,c2必须具有相同的类型.运用swap赋值通常比c1=c2.swap只是交换两个容器的内部数据结构,其元素本身并没有被交换,这也就意味着指向容器的迭代器,引用和指针在swap操作之后都不会失效.继而在执行swap后,可以通过该容器的迭代器访问交换后元素,如:
#include <iostream> #include <vector> #include <string> using namespace std; int main(){ vector<int> ivec1(10,1); vector<int> ivec2(10,2); swap(ivec1,ivec2); for(vector<int>::iterator kk=ivec1.begin();kk!=ivec1.end();++kk) cout << *kk << endl; return 0; }
resize(n)用于改变容器的大小,当将容器扩大时,则超出的部分默认初始化为0,若将容器缩小,则超出的元素将被删除,如:
#include <iostream> #include <vector> #include <string> using namespace std; int main(){ int a[10]={0,1,2,3,4,5,6,7,8,9}; vector<int> ivec(a,a+10); ivec.resize(20); //ivec.resize(5); for(vector<int>::iterator test=ivec.begin();test!=ivec.end();++test) cout << *test ; cout << endl; return 0; }
关于删除元素操作后迭代器会失效,因此一定要对迭代器重新赋值,更新迭代器。如果删除操作比较频繁,一般选择list。
#include <iostream> #include <vector> #include <string> using namespace std; int main(){ int a[10]={0,1,2,3,4,5,6,7,8,9}; vector<int> ivec(a,a+10); for(vector<int>::iterator test=ivec.begin();test!=ivec.end();++test){ if(*test%2==0){ test=ivec.erase(test); --test; } } for(vector<int>::iterator test=ivec.begin();test!=ivec.end();++test){ cout<< *test <<' '; } cout << endl; return 0; }
下面是某位仁兄写的,我觉得能更好地说明,所以一并贴出:
#include<iostream> #include<list> #include<vector> #include<deque> using namespace std; void print(list<int>::iterator beg,list<int>::iterator end) { while(beg!=end) { cout<<*beg<<" "; beg++; } cout<<endl; } void print(vector<int>::iterator beg,vector<int>::iterator end) { while(beg!=end) { cout<<*beg<<" "; beg++; } cout<<endl; } void deleteelem(list<int>&lst,int flag) { int base=(flag%2==0?0:1); list<int>::iterator head=lst.begin(),tail=lst.end(); while(head!=tail) //这里不用更新指向容器尾端的迭代器 //因为list容器删除元素后没有出现元素的移动 { if(*head%2==base) head=lst.erase(head); //巧妙利用函数返回值 else head++; } } void deleteelem(vector<int>&vec,int flag) { int base=(flag%2==0?0:1); vector<int>::iterator head=vec.begin(),tail=vec.end(); while(head!=(tail=vec.end())) //这里要更新一下指向容器尾端的迭代器 //因为vector容器删除元素后元素要顺序前移是迭代器失效 { if(*head%2==base) head=vec.erase(head); else head++; } } int main() { int ia[10]={0,1,2,3,4,5,6,7,8,9}; list<int>odd(ia,ia+10); vector<int>even(ia,ia+10); print(odd.begin(),odd.end()); print(even.begin(),even.end()); deleteelem(odd,2); print(odd.begin(),odd.end()); deleteelem(even,1); print(even.begin(),even.end()); return 0; }
顺序容器(二)--《C++ primer》
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。