现在的位置: 首页 > 综合 > 正文

从一个csdn的例子来看标准算法和容器,跌带器的关系

2013年07月31日 ⁄ 综合 ⁄ 共 1884字 ⁄ 字号 评论关闭

 

输出结果:
Vector v1 is ( 7 1 9 2 0 7 7 3 4 6 8 5 7 7 ).
Vector v1 with elements satisfying greater6 removed is
 ( 1 2 0 3 4 6 5 3 4 6 8 5 7 7 ).
Vector v1 resized elements satisfying greater6 removed is
 ( 1 2 0 3 4 6 5 ).
结果出乎我们的意料,第一次调用remove_if ()竟然没有把大于6的数字全部删除掉,还有两个7,这就要从算法、迭代器、容器的关系
(1)所有的标准库算法只是操作了容器里面的元素,并不改变容器本身的性质,比如他的大小,并不改变它的大小。这从第二行输出结果看出来,容器大小不改变。
(2)容器本生的性质只能通过它的成员函数来改变,比如resize()改变容器的长度,erase()删除元素,注意:必须是容器的成员函数。如本例中删除大于7的元素用的是 v1.erase (new_end, v1.end( ) );
(3)remove_if ()的内部实现机制:算法是作用在底层的容器中的,把容器移动到新的位置,所以说并不是向我们想像的那样直接找到就删除大于6的元素,函数是把使谓词为假的函数复制到容器的开头部分,,,所以出现了第二行的输出结果

(4)算法并不改变迭代器。
一个简单的例子;
vector<int> ivec;
ivec.push_back(1);
ivec.push_back(0);
 vector <int>::iterator begin=ivec.begin();
vector<int>::iterator  end=ivec.end();
find(begin,end,0);
cout<<*begin;

输出结果是1,;
如果这样改的话:
vector<int>::iterator result= find(begin,end,0);
cout<<*result;
输出结果是0;
此例子充分说明了标准算法不直接改变容器的迭代器,但是如果元素存在的话可以返回对应元素的迭代器,此迭代器可以用来直接操作容器,如给容器写
**result=2; //ivec.at(1)变为了2;

个人感觉研究源码还是有好处的,至少原理性的东西知道的话,可以使我们少犯错误,尤其是对容器的操作,标准库算法和迭代器的关系。
要不然以后用起算法来的时候自以为然的话换错误的概率是相当的大的,尤其是使用算法进行一些删除,插入操作。。。

抱歉!评论已关闭.