将具有唯一指针的向量复制到新向量中
To copy a vector of unique pointer into new vector
当我编译下面的代码时,我得到一个编译错误:
std::vector<std::unique_ptr<boxIndex>> tmpVec;
for(const auto& it: hrzBoxTmpMap){
for(const auto& it2: hrzBoxVec){
std::copy_if(hrzBoxVec.begin(), hrzBoxVec.end(), tmpVec.begin(), [&](std::unique_ptr<boxIndex>& p)
{
return !(it.second == p->getTop() &&
it.first != p->getLeft() );
});
}
}
编译错误是:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/stl_algo.h:
> In instantiation of ‘_OIter std::copy_if(_IIter, _IIter, _OIter,
> _Predicate) [with _IIter = __gnu_cxx::__normal_iterator<std::unique_ptr<boxIndex>*, std::vector<std::unique_ptr<boxIndex> > >; _OIter =
> __gnu_cxx::__normal_iterator<std::unique_ptr<boxIndex>*, std::vector<std::unique_ptr<boxIndex> > >; _Predicate =
> smoothHrzIndexing(std::vector<std::unique_ptr<boxIndex>
> >&)::<lambda(std::unique_ptr<boxIndex>&)>]’: test_word_2.cpp:282:5: required from here
> /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/stl_algo.h:990:6:
> error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>&
> std::unique_ptr<_Tp, _Dp>::operator=(const std::unique_ptr<_Tp, _Dp>&)
> [with _Tp = boxIndex; _Dp = std::default_delete<boxIndex>]’ In file
> included from
> /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/memory:86:0,
> from test_word_2.cpp:8: /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/unique_ptr.h:263:19:
> error: declared here
有人能帮我一下吗? 你能做的是使用std::move_iterator<...>
,例如,如下所示(这是一个演示关键的SSCCE:
#include <iostream>
#include <iterator>
#include <vector>
#include <memory>
int main()
{
std::vector<std::unique_ptr<int>> boxVec;
boxVec.emplace_back(new int(1));
boxVec.emplace_back(new int(17));
boxVec.emplace_back(new int(3));
std::vector<std::unique_ptr<int>> tmpVec;
std::copy_if(std::make_move_iterator(boxVec.begin()),
std::make_move_iterator(boxVec.end()),
std::back_inserter(tmpVec),
[&](std::unique_ptr<int> const& p){
return *p == 17; });
for (auto const& x: boxVec) {
(x? std::cout << *x: std::cout << "<null>") << " ";
}
std::cout << "n";
}
对std::move_iterator<It>
解引用将返回迭代器值类型的合适右值。由于右值是用std::move(*it)
得到的,所以它是一个参考。也就是说,在实际移动值之前,值不会被窃取。比较使用const&
,也就是说,它不会窃取值。该赋值将变为右值赋值。代码还使用std::back_inserter()
来安排目标中足够的元素。
我不认为这是一个坚实的解决方案,但我也不认为有像std::move_if()
这样的算法(或任何导致相同行为的算法的自定义)。要真正处理有条件地移动对象,我认为您需要不同的访问机制来传递给谓词的值和对象的分配方式(属性映射将解决这些问题,但目前还没有建议将它们添加到c++标准中)。
没有直接的方法可以做到这一点,但是您可以链接一些STL命令来实现您想要的:
-
std::stable_partition
或std::partition
将容器分成两半。 -
std::move
将您想要移动的值移动到新矢量 -
vector.erase
删除旧的无效unique_ptr
最后你有一个干净的源向量(所有的移动,无效的条目被删除)和一个干净的目标向量。
可以像这样:
std::vector<std::unique_ptr<int>> source, target;
// ... fill data
auto it = std::stable_partition(begin(source),end(source),[](std::unique_ptr<int> const& val) {
return *val < 3; // your negated condition
});
std::move(it,end(source),std::back_inserter(target));
source.erase(it,end(source));
下面是一个实例
std::unique_ptr
是活动, 不可以复制。
因此,您不能在unique_ptr
实例中使用std::copy_if()
。
如果你真的想使用std::copy_if()
,那么你可以使用std::shared_ptr
而不是std::unique_ptr
,然后如果你想摆脱旧的矢量内容,只需使用vector::clear()
来销毁它。
或者,如果shared_ptr
对您来说开销太大,或者在任何情况下您只想要一个unique_ptr
的向量,那么您可能需要考虑使用std::remove_if()
和erase-remove习语就地删除不需要的向量元素。
- 计算排序向量的向量中唯一值的计数
- C++将向量的向量拆分为向量的N个子向量
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 循环向量的向量并附加到新向量
- C 矢量元素擦除与新向量创建
- 仅使用重复项创建他人的新向量
- 如何将文本文件的每一行分配给新向量
- C++数组选择平方数并创建新向量
- 如何将映射的内容从一个类复制到另一个类的新向量中
- 如何从字符串向量 c++ 而不是新向量过滤
- 在C++中检查向量项并添加到新向量中
- 将旧向量设置为等于新向量
- c ++我可以在我的代码中将这样的向量新到哈希图中吗?
- 如何使用 STL 的 copy() 从现有向量创建新向量?
- 从向量中移除元素,并将该元素添加到新向量c++中
- 如何在向量的向量开头添加新行
- 从类实例的向量中提取类成员(作为新向量)
- 将具有唯一指针的向量复制到新向量中
- c++计算一个新向量,该向量与现有向量有delta
- 如何在 c++ 中从现有 2D 向量创建具有特定列的新向量