假设我们想从向量中删除重复值int
秒。 通常的解决方法是排序的矢量和擦除与擦除remove惯用法重复。 但是,我们需要十个分量不会被删除的元素的顺序,所以我们不能排序。 所以有人会想出这样的断言,并与使用remove_if
算法:
struct comp {
std::set<int> s;
comp() : s() {}
bool operator()(int i)
{
return !(s.insert(i)).second;
}
};
但是,这将打破,如果谓词对象将被复制出于某种原因,因为我们将得到的两个副本set
成员。 事实上,海湾合作委员会实现remove_if
正是这么做的:
template<typename _ForwardIterator, typename _Predicate>
_ForwardIterator
remove_if(_ForwardIterator __first, _ForwardIterator __last,
_Predicate __pred)
{
__first = _GLIBCXX_STD_A::find_if(__first, __last, __pred);
if(__first == __last) // ^^^^^ here a copy is made
return __first;
_ForwardIterator __result = __first;
++__first;
for(; __first != __last; ++__first)
if(!bool(__pred(*__first)))
{
*__result = _GLIBCXX_MOVE(*__first);
++__result;
}
return __result;
}
解决方法是使set
我们的仿函数的静态成员:
struct comp {
static set<int> s;
comp() { s. clear(); }
bool operator()(int i)
{
return !(s.insert(i)).second;
}
};
set<int> comp::s;
但问题依然存在:
我们需要确保谓词函子的可能复制不会打破我们的逻辑是什么? 有没有在强制要求(或禁止)某些行为方面对这一问题的标准什么? 或者是在执行中的错误?