【发布时间】:2019-01-01 09:49:45
【问题描述】:
我正在尝试对包含 const 对象的智能指针的对向量进行排序。我试图仅根据第一个对象进行排序。下面你会看到(我无数次尝试编写的)代码应该执行此操作,以及错误的摘录。
编译器抱怨 lambda 参数。我试图使参数 const、non-const、references、rvalue-references 无济于事。请帮忙?
std::pair<int, std::unique_ptr<const std::string> > a;
auto uniq = std::make_unique<const std::string>("hurz");
a = std::make_pair(1,std::move(uniq));
std::pair<int, std::unique_ptr<const std::string> > b;
uniq = std::make_unique<const std::string>("hurz");
b = std::make_pair(2,std::move(uniq));
std::vector<std::pair<int,std::unique_ptr<const std::string> > > vec;
vec.push_back(std::move(a));
vec.push_back(std::move(b));
std::sort(std::make_move_iterator(vec.begin()),
std::make_move_iterator(vec.end()),
[]
(const std::pair<int,std::unique_ptr<const std::string> >& i1,
const std::pair<int,std::unique_ptr<const std::string> >& i2)
{ return i1.first > i2.first;});
错误信息对我没有帮助:
error: no matching function for call to
'swap(std::move_iterator<__gnu_cxx::__normal_iterator<std::pair<int,
std::unique_ptr<const std::basic_string<char> > >*, std::vector<std::pair<int,
std::unique_ptr<const std::basic_string<char> > > > > >::value_type,
std::move_iterator<__gnu_cxx::__normal_iterator<std::pair<int,
std::unique_ptr<const std::basic_string<char> > >*, std::vector<std::pair<int,
std::unique_ptr<const std::basic_string<char> > > > > >::value_type)' swap(*__a,
*__b);
candidates are:
/usr/include/c++/4.9/bits/move.h:166:5: note: void std::swap(_Tp&, _Tp&)
[with _Tp = std::pair<int, std::unique_ptr<const std::basic_string<char> > >]
plus many more errors in the same vein
【问题讨论】:
-
为什么需要
std::unique_ptr<const std::string>而不是简单的std::string? -
字符串只是一个例子。我有一些我传递的对象,一旦超出范围,我想收集垃圾。
-
“我有我传递的对象......” 这表明你需要
std::shared_ptr而不是std::unique_ptr。看看他们的所有权概念。 -
我从不同时将对象保存在两个地方,并且 shared_ptr 对我的应用程序的性能影响太大。
-
@NathanOliver Same result here
标签: c++ sorting smart-pointers move-semantics