C ++从map创建排序向量

时间:2014-06-06 00:04:49

标签: c++ sorting vector map

我尝试从vector创建排序的map,并根据不是地图键的值进行排序。 地图值为block对象,我希望矢量根据size的属性block进行排序。
我的代码:

#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*>&)’

2 个答案:

答案 0 :(得分:2)

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&

Live demo


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

  

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

所以标准从未提到函子的参数类型必须是 binary_pred,但是libstdc ++似乎正在将临时函数传递给函子和代码doesn't compile,除非你添加了const&(看起来这已在gcc-4.9中修复)。

另一方面,libc ++和VS2013 handle the case的参数都不正确const&

答案 1 :(得分:0)

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

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&或按值传递的对象。其他人则参考。