的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