对指针向量进行排序会更改该向量副本中的数据
sort on a vector of pointers changes data in a copy of the vector?
我有一个指向对象的指针向量,并且在某个时候,创建了第二个包含该向量的子元素的向量。现在,对原向量进行排序会改变第二个向量中的元素(排序后,第二个向量中的元素完全不同)。
这是预期的行为吗?它和make_indirect_iterator有关系吗?是否有更好的解决方案(假设我想保持一个指针向量)?
std::vector<std::shared_ptr<MyObj>> vecAll;
std::vector<std::shared_ptr<MyObj>> vecSub;
// fill vecAll with something...
for(auto obj : vecAll) {
if( obj->x >=0 ) {
vecSub.push_back(obj);
}
}
// 3 objects in 'vecSub'
std::sort(boost::make_indirect_iterator(vecAll.begin()), boost::make_indirect_iterator(vecAll.end()), std::greater<MyObj>());
// now there are 3 DIFFERENT objects in 'vecSub'
是的,它与make_indirect_iterator
有关。这将导致对象值被交换,而不仅仅是指针的重新排序。
可以使用普通迭代器,并在比较步骤中执行解引用操作。lambda使这更容易:
typedef decltype(vecAll.front()) iter;
std::sort(vecAll.begin(),
vecAll.end(),
[](iter a, iter b) { return *a > *b; });
带有可重用函子的版本(感谢MooingDuck的建议):
struct indirect_greater
{
template<typename iter>
bool operator()(iter a, iter b) const { return *a > *b; }
};
std::sort(vecAll.begin(), vecAll.end(), indirect_greater());
c++ 14增加了多态lambda,这将允许您编写一个短lambda [](a, b)(*a > *b)
,其行为类似于第二个(函子)解决方案。不需要命名迭代器类型(例如用decltype
)
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 构造字符串向量时是否有任何副本?
- 替代STD ::向量存储参考而不是对象的副本
- 构造向量时如何摆脱(一个)不必要的副本
- 在一个映射向量上迭代,如果满足条件,则插入一个副本
- 抽象类的shared_ptr向量到副本的向量
- 是否可以将向量初始化为附加额外元素的另一个向量的副本
- 指针是否可能在没有任何数据副本的情况下被向量所拥有
- 创建由shared_pointers向量的元素所指向的对象的副本
- 用向量本身的副本交换向量
- 如何在构造具有不同类型元素的向量副本时显式转换
- 对指针向量进行排序会更改该向量副本中的数据
- 如何在基类的向量中返回派生对象的副本