关于c++顺序容器小结(二)---基本操作
2015-11-09 21:45
966 查看
各个容器都包含在自己的头文件中
构造:V v1;
V v2(v1);
V v1={a,b,c,d….};
操作(所有容器的基本操作):
v1.size();返回容器大小;
swap(v1,v2)交换容器元素//仅当元素类型一致是才可交换
v1.swap(v2);交换v1,v2的元素;
v1.max_size();返回容器可保存的最大元素数目;
v1.empty();判断容器是否为空;
v1.insert(args);想容器中插入元素;
v1.emplace(inits);使用inits构造c中的一个元素;
v1.erase(args); 删除指定的args元素;
v1.clear();删除容器内所有元素;
关系 运算符:
==;!=;
<,>,<=,>=;
迭代器:
v1.begin(),v1.end() 返回首位元素后的迭代器;
v1.cbegin(),v1.cend() 返回const_iterrator;
容器的拷贝:
一:直接拷贝;
二:拷贝另一个容器迭代器指定范围内的元素;
添加元素:
push_back:
特殊的forward_list操作:
当添加或删除元素时,之前的袁术的后继会发生改变,需要访问前去是需要改变前驱的连接,但是forward_list是单向链表没有获取其前驱的方法,所以在forward__list中是通过改变给定元素后的元素来完成的;
在forward_list中没有定义insert,emplace和erase,而是定义了insert_after,emplace_after和erase_after。
改变容器大小:
v.resize(n)来增大或减小容器的大小;若n小于v.size()则多出的元素被丢弃
容器的操作可能是迭代器失效:
*vector和string中如果内存被重新分配则迭代器、指针和引用都会失效,如果未重新分配内存,则插入如元素之前的迭代器,指针,引用都有效,后面的都失效
*deque在首尾之外插入都会导致失效,若果在收尾添加则不会失效
*对于list、forward_list无影响
**当我们啥暗处元素时尾后迭代器都会失效
vector的增长:
为了支持随机访问,vector将元素紧挨着存放,通常会按预留一些空间来保存更多的新元素,这样就不会因为每次添加新元素都重新分配内存了,同时也提高了效率。
管理容量的成员函数:
v.shrink_to_fit();//将容量减少为何何size同样的大小,只适用于vector、string和deque;
v.capacity();//不重新分配内存的话能保存的最大元素数;
v.reserve(n);//分配至少能存n个元素的空间
string的其他方法:
append()和replace():
append是在尾部追加字符串,replace可以在任意指定位置删除或添加指定长度的字符串
append(”djsdn”);//在尾部添加djsdn
replace(11,3,”dsss”);//从11位置开始删除三个元素并插入新字符
搜索操作:
s.find(args); 查找s中args第一次出现的位置
s.rfind(args); 查找s中args最后一次出现的位置
s.find_first_of(args); 在s中查找args中任何一个字符第一次出现的位置
s.find_last_of(args); 在s中查找args任何一个字符最后出现的位置
s.find_first_not_of(args); 在s中查找第一个不在args中的字符
s.find_last_not_of(args);在s中查找最后一个不在 args中的字符
容器适配器:
stack(栈),queue(队列),priority_queue(优先队列)。
构造:V v1;
V v2(v1);
V v1={a,b,c,d….};
操作(所有容器的基本操作):
v1.size();返回容器大小;
swap(v1,v2)交换容器元素//仅当元素类型一致是才可交换
v1.swap(v2);交换v1,v2的元素;
v1.max_size();返回容器可保存的最大元素数目;
v1.empty();判断容器是否为空;
v1.insert(args);想容器中插入元素;
v1.emplace(inits);使用inits构造c中的一个元素;
v1.erase(args); 删除指定的args元素;
v1.clear();删除容器内所有元素;
关系 运算符:
==;!=;
<,>,<=,>=;
迭代器:
v1.begin(),v1.end() 返回首位元素后的迭代器;
v1.cbegin(),v1.cend() 返回const_iterrator;
容器的拷贝:
一:直接拷贝;
二:拷贝另一个容器迭代器指定范围内的元素;
list<string> v1 ={"first","second","thrid"};//列表初始化 vector<const char *>v1={"a","b","c"}; list<string>list2(v1);//正确,类型匹配 deque<string>list1(v1);//错误 容器类型不匹配 forward_list<string>v(v1.begin(),v1.end())//正确,虽然类型不匹配但是const char* 元素可以转换为string
添加元素:
push_back:
vector<string>V; string word; while(cin>> word){ V.push_back(word); } //在string的末尾添加字符 void fun(size_t count, string &word) { if(count>1) word.push_back("kjsd");//等价于+='kjsd' } push_front///在容器头添加元素 list<int >ilist ; for(size_t ix=0;ix!=4;ix++){ ilist.push_front(ix);//每个元素将会被一次插入在容器开始位置 } insert//在容器特定位置插入元素 V.insert(V.begin(),"hello");//等价于V.push_front(); V.insert(iter,"hello");//在迭代器iter前添加 vector<string>v={"one","two","three"}; V.insert(V.begin(),v.end-2,v.end());//将v的嘴壶两个元素添加到V的开始位置 list<string>lst; auto iter=lst.begin(); while(cin>>word) iter=list.insert(iter.word);//用insert的返回值在特定位置插入元素 访问元素: if(!lst.empty()){ auto val=lst.degin(); while(val!=lst.end()){ cout<<*val<<endl; val++; } } 删除元素:相对于插入的push_front和push_back,删除就是pop_front和pop_back; while(!lst.empty()){ fun(lst.front());//处理元素 lst.pop_fornt();//处理完后删除首元素,pop_back同理 } 如果从内部 啥暗处星对与insert的函数是erase list<int>bob{1,2,3,4,5,6,7}; auto it=bob.begin(); while(it!=bob.end()){ if(*it%2){ it=bob.erase(it);///删除奇数元素 } }
特殊的forward_list操作:
当添加或删除元素时,之前的袁术的后继会发生改变,需要访问前去是需要改变前驱的连接,但是forward_list是单向链表没有获取其前驱的方法,所以在forward__list中是通过改变给定元素后的元素来完成的;
在forward_list中没有定义insert,emplace和erase,而是定义了insert_after,emplace_after和erase_after。
forward_list<int >flast={1,2,3,4,5}; auto prev=flast.before_begin(); auto cuur=flast.begin(); while(curr!=flast.end()){ if(*curr%2) curr=flast.erase_after(prev); else{ prev=curr; curr++; } }
改变容器大小:
v.resize(n)来增大或减小容器的大小;若n小于v.size()则多出的元素被丢弃
容器的操作可能是迭代器失效:
*vector和string中如果内存被重新分配则迭代器、指针和引用都会失效,如果未重新分配内存,则插入如元素之前的迭代器,指针,引用都有效,后面的都失效
*deque在首尾之外插入都会导致失效,若果在收尾添加则不会失效
*对于list、forward_list无影响
**当我们啥暗处元素时尾后迭代器都会失效
vector的增长:
为了支持随机访问,vector将元素紧挨着存放,通常会按预留一些空间来保存更多的新元素,这样就不会因为每次添加新元素都重新分配内存了,同时也提高了效率。
管理容量的成员函数:
v.shrink_to_fit();//将容量减少为何何size同样的大小,只适用于vector、string和deque;
v.capacity();//不重新分配内存的话能保存的最大元素数;
v.reserve(n);//分配至少能存n个元素的空间
string的其他方法:
append()和replace():
append是在尾部追加字符串,replace可以在任意指定位置删除或添加指定长度的字符串
append(”djsdn”);//在尾部添加djsdn
replace(11,3,”dsss”);//从11位置开始删除三个元素并插入新字符
搜索操作:
s.find(args); 查找s中args第一次出现的位置
s.rfind(args); 查找s中args最后一次出现的位置
s.find_first_of(args); 在s中查找args中任何一个字符第一次出现的位置
s.find_last_of(args); 在s中查找args任何一个字符最后出现的位置
s.find_first_not_of(args); 在s中查找第一个不在args中的字符
s.find_last_not_of(args);在s中查找最后一个不在 args中的字符
容器适配器:
stack(栈),queue(队列),priority_queue(优先队列)。
#include<stack> deque<int> deq; stack<int>sk(deq);//从deq拷贝元素到sk; for(size_t ix=0; ix!=10;ix++){ sk.push(ix);//元素入栈 } while(!sk.empty()){ int value=sk.top();///使用栈顶元素 sk.pop();//栈顶元素出栈,循环继续 } stack<int> s;//定义空栈s #include<queue>///包含queue和priority_queue queue<int>q; q.pop();//返回queue中队首元素或priority_queue中优先级高的元素,**并删除** q.front();//返回手元素或尾元素,不删除 q.top();//只适用于priority_queue q.back();//只适用于queue q.push(item);在队尾或priority_queue恰当位置添加元素 q.emplace(args);//其值为item或者由args构造
相关文章推荐
- 3.c/c++程序员面试宝典-变量
- DOxygen for C++使用说明——注释代码二
- C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
- c++用gsoap调用webservice备忘
- Visual Studio 2010中C++项目升级指南
- vc++从txt文件中读取数据
- c++中虚函数和纯虚函数定义
- c语言中的各种printf
- DOxygen for C++使用说明——Markdown支持
- 【黑马程序员】 我的C语言学习笔记(1)数据类型
- 排序算法之冒泡排序
- C++设计模式[八]装饰模式
- C++学习——父类指针和子类指针的步长问题
- C++学习路线
- c与c++中enum和struct定义的区别
- C++学习——多态原理
- C语言笔记(结构体与offsetof、container_of之前的关系)
- 栈在程序中的作用(ARM结构)
- NOJ 5538 c语言
- NOJ 5533 c语言