c++ - 根据 pair.first 对 std::pair<int, std::unique_ptr<const T>> 的 vector 进行排序

标签 c++ sorting smart-pointers move-semantics

我正在尝试对包含 const 对象的智能指针的对 vector 进行排序。我试图仅根据第一个对象进行排序。下面你会看到(我无数次尝试编写的代码之一)应该执行此操作的代码,以及错误的摘录。

编译器提示 lambda 参数。我试过使参数为常量、非常量、引用、右值引用,但都无济于事。请帮忙?

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::make_move_iterator 的使用。当你这样做时,你将迭代器变成了 move_iterator,这意味着当你取消引用它们时,你会得到一个 T&&,而不是像你这样的 T&使用普通迭代器。

std::swap,它在您的 std::sort 实现中使用,只接受左值引用,因此它不能绑定(bind)到取消引用的迭代器。如果你使用

std::sort(vec.begin(),
    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;});

相反,您将拥有要绑定(bind)到 std::swap 的左值,并且 std::swap 将适用于仅 move 类型

关于c++ - 根据 pair.first 对 std::pair<int, std::unique_ptr<const T>> 的 vector 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51504270/

相关文章:

c++ - 运行中的Thread与线程对象的关系

c++ - 重复输入请求

java - 快速排序算法改进

PHP 通过另一个数组(表)按键对数组进行排序

c++11 - 命名 API 是否意味着内存所有权的转移?

c++ - 函数指针类型的 Typedef

ios - 按每个对象的 bool 值排序并显示在 Collection View 中

c++ - 相当于智能指针

c++ - 将对非指针成员变量的引用作为指针返回可以吗?

c++ - 嵌套 If 语句中的代码