C++从地图创建排序的矢量

C++ creating sorted vector from map

本文关键字:排序 创建 地图 C++      更新时间:2023-10-16

我正在尝试从map创建一个排序vector,根据不是地图键的值进行排序。map值是block对象,我希望向量根据sizeblock的属性进行排序。
我的代码:

#include <map>
#include <string>
#include <vector>
struct block {
    string data;
    int size;
};
struct vecotrCompare {
    bool operator()(pair<const string, block*> &left,
      pair<const string, block*> &right) {
        return left.second -> size < right.second -> size;
    }
};
int main() {
    map<const string, block*> myMap;
    vector<pair<const string, block*> > myVector(
      myMap.begin(), myMap.end());
    sort(myVector.begin(), myVector.end(), vecotrCompare());
}

sort(...)行无法编译,并且我收到编译错误:

error: no match for call to ‘(vecotrCompare) (std::pair<const
  std::basic_string<char>, block*>&, const std::pair<const
  std::basic_string<char>, block*>&)’

vector中的元素必须是 MoveAssignable 或 CopyAssignable。pair<const string, block*>既不是由于const string.将其更改为 string 和代码编译。

map<string, block*> myMap;
vector<pair<string, block*> > myVector(myMap.begin(), myMap.end());

同时更改比较器,以便参数类型const&

struct vecotrCompare {
    bool operator()(pair< string, block*> const&left, 
                    pair< string, block*> const&right) const {
        return left.second -> size < right.second -> size;
    }
};

现场演示


关于需要const&的参数的第二部分实际上不是必需的。来自 §25.1/9

每当算法需要函数对象时,就会使用 BinaryPredicate 参数,该函数对象应用于取消引用两个相应迭代器的结果或取消引用迭代器并在T是签名的一部分时键入 T 返回可测试的值为 true 。换句话说,如果算法将BinaryPredicate binary_pred作为其参数,first1first2作为其迭代器参数,则它应该在构造中正常工作binary_pred(*first1, *first2)上下文转换为bool(第4条(。 BinaryPredicate总是将第一个迭代器的value_type作为其第一个参数,也就是说,在T值是签名的一部分的情况下,它应该在构造中正常工作binary_pred(*first1, value)上下文转换为bool(第 4 条(。 binary_pred不得通过取消引用的迭代器应用任何非常量函数

所以标准从来没有提到函子的参数类型必须是const&的,但libstdc++似乎将临时传递给函子,除非你添加const&,否则代码不会编译(看起来这已经在gcc-4.9中修复了(。

另一方面,libc++ 和 VS2013 都处理参数未正确const&的情况。

除了 @Praetorian 建议的更改之外,您还应该在 vectorCompare::operator() 中添加一些const

struct vecotrCompare {
    bool operator()(pair<const string, block*> const& left,
                    pair<const string, block*> const& right) const {
        return left.second -> size < right.second -> size;
    }
};

以下是有关comp要求的文档 http://www.cplusplus.com/reference/algorithm/sort/。

比较

接受范围内的两个元素作为参数的二进制函数,并返回可转换为 bool 的值。返回的值指示作为第一个参数传递的元素是否被视为在其定义的特定严格弱排序中先于第二个参数。

该函数不得修改其任何参数。

这可以是函数指针或函数对象。

某些编译器强制const&参数类型或按值传递的对象。其他人则使用参考。