的reference说由std :: remove_if去除的元素去哪里?
template< class ForwardIt, class UnaryPredicate >
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p);
迭代器指向老的 范围内新的两端之间的元素仍然提领,但元素本身具有 未定值。
我试过这个简单的程序,找出他们的意思是“未指定的值”。
#include <vector>
#include <memory>
#include <iostream>
#include <algorithm>
int main()
{
std::vector< std::shared_ptr<int> > ints;
for (int i = 0; i < 10; ++i)
ints.push_back(std::make_shared<int>(i));
std::remove_if(ints.begin(), ints.end(),
[](const std::shared_ptr<int>& element)
{
return *element % 7 != 0;
});
for (int i = 0; i < 10; ++i)
std::cout << *ints[i] << std::endl;
return 0;
}
输出是:
0
7
2
3
4
5
6
The program has unexpectedly finished.
这就是神秘的东西第七元素,这会导致段错误发生后的数据。
有趣的是,从here
template<class ForwardIt, class UnaryPredicate>
ForwardIt remove_if(ForwardIt first, ForwardIt last,
UnaryPredicate p)
{
ForwardIt result = first;
for (; first != last; ++first) {
if (!p(*first)) {
*result++ = *first;
}
}
return result;
}
可能执行不产生段错误。
这是一个错误?由于迭代器应该是无法引用的。我正在使用gcc 4.7.3
*“他们不能修改底层容器”*。那是不正确的。他们会修改容器,因为操作会导致元素重新排列。他们不能做的是减少容器的大小(即'container.size()'会在'std :: remove_if'之前和之后返回相同的值,只有一些元素(被操作删除)是未指定的*按照C++标准)。 – Nawaz 2013-05-10 07:01:49
@Nawaz我的部分措辞不佳。我已经重新回答了我的答案。 – Yuushi 2013-05-10 07:04:38
C++标准算法不适用于**容器**。它们适用于**序列**。容器是序列的一个来源,但不是唯一的来源。 – 2013-05-10 13:47:56