根据pair.first排序std :: pair <int,std :: unique_ptr <const T>>的向量

the*_*ast 3 c++ sorting smart-pointers move-semantics

我正在尝试对包含const对象的智能指针的对向量进行排序.我只是想根据第一个对象进行排序.下面你看到(我的许多尝试之一)代码应该这样做,以及错误的摘录.

编译器抱怨lambda参数.我试图使参数const,非const,引用,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;});
Run Code Online (Sandbox Code Playgroud)

错误消息没有帮助我:

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
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 7

这里的问题是使用std::make_move_iterator.当你这样做时,你将迭代器转换成move_iterator's',这意味着当你取消引用它们时,你会获得一个T&&,而不是T&像普通迭代器那样.

std::swap,在你的实现中使用std::sort只接受左值引用,因此它不能绑定到解引用的迭代器.如果你使用

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;});
Run Code Online (Sandbox Code Playgroud)

相反,你将有左值std::swap来绑定,并将std::swap只适用于移动类型