您的位置:首页 > 其它

9.3顺序容器操作

2015-04-19 22:51 204 查看

笔记

c.begin();c.end();c.rbegin();c.rend();
都是函数方法,返回一个iterator。

2.
c.push_back();c.push_front();
其中
c.push_front
只是用于list和deque容器类型

3.insert三种用法:

c++

c.insert(p,t);//iterator p前面插入值为t的元素,返回t所在的iteratior

c.insert(p,n,t)//插入n个t,但是返回void

C.insert(p,beg,end);//插入iteratior beg到end这个范围内的元素


由于方法一中insert函数返回指向新插入元素的迭代器。可以使用该返回值在容器中的指定位置重复插入元素

c++

list<string> lst;

list<string>::iterator iter=lst.begin();

while(cin>>word)

iter=lst.insert(iter,word);


4.在vector容器中添加元素可能导致整个容器的重新加载,这样的话,该容器涉及的所有迭代器都会失效。即使不需要重新加载整个容器,指向新插入元素后面的元素的迭代器也会失效。

任何insert或push操作都有可能导致迭代器失效。所以当循环将元素插入到vector或deque容器中时,不虚确保迭代器在每次循环后得到更新。

要避免存储end操作返回的迭代器

vector<int>::iterator first=v.begin(),last=v.end();
while(first!=last){
first=v.insert(++first,42);
++first;//advance *first* just past the element we add
}


程序将end返回的迭代器值存储在last中,但是添加元素可能会是的容器更新,存储在last中的迭代器失效,从而造成死循环。

while循环应该改为
while(first!=v.end())


5.关系操作符。比较的容器必须有相同的容器类型,而且要有相同的元素类型。

容器的比较是基于元素内元素的比较。容器的比较实用了元素类型定义的同一个操作关系符。

如容器是 vector,那么两个容器的比较方法就用的string的比较方法,规则相同。

当元素类型是类类型的话,如
vector<Sales_item>
,若Sales_item没有定义
<
或者
>
这样的关系运算符的话,就不能进行比较。

6.容器的大小操作:

c.size() 返回c中的元素个数。返回类型为c::size_type

c.max_size() 返回最多能容纳多少元素。 返回类型为c::size_type

c.empty() 返回bool值,空就返回1

c.resize(n) 调整容器大小,使其能够容纳n个元素。若n

习题

9.19

vector<int>::iterator iter=iv.begin();
while(iter!=iv.begin()+iv.size()/2){
if(*iter==some_val){
iter=iv.insert(iter,2*some_val);
iter+=2;
}
else ++iter;
}


注意:

1)循环的判定条件是容器的中点,但是由于每一次循环都可能要插入元素,会导致容器的迭代器失效,所以每次循环都要计算,而不是将iv的中点迭代器存储下来

2)iter+=2;是因为insert(iter,2*some_val);是将元素插在iter这个迭代器之前,返回新元素的迭代器。+1就指向了原来的iter,再+1才会指向原来iter之后的元素,故+2。

9.20
cin.clear()
用法

9.26使用eraser删除vector容器中的欧数值

int ia[]={0,1,1,2,3,5,8,13,21,55,89};
vector<int> odd_vector(ia,ia+11);
vector<int>::iterator odd=odd_vector.begin();
while(odd!=odd_vector.end()){
if(*odd%2==0)
odd=odd_vector.erase(odd);//eraser函数返回指向被删除元素后面的元素的迭代器,所以不用odd++;一定别忘记用它来更新odd迭代器
else odd++;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: