笔记
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++;
}