您的位置:首页 > 编程语言 > C语言/C++

关于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;

容器的拷贝:

一:直接拷贝;

二:拷贝另一个容器迭代器指定范围内的元素;

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构造
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: