C++从地图创建排序的矢量
C++ creating sorted vector from map
我正在尝试从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*>&)’
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
作为其参数,first1
和first2
作为其迭代器参数,则它应该在构造中正常工作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&
参数类型或按值传递的对象。其他人则使用参考。
- 从具有自定义排序的向量创建集合
- 合并排序不排序自创建数组类 c++
- MOVNTI 存储是否相对于由同一线程创建的其他 MOVNTI 存储重新排序?
- 如何创建一个C++程序来读取字符串数组中的信息,然后将其排序到类中?
- 尝试创建排序的动态列表(数据结构)
- 创建一个函数以查找数组中的重复项,而无需对C++进行排序
- C MultiSet从排序的向量创建
- 如何按创建日期对文件进行排序
- 我刚刚创建了一个非常快速的素数排序方法.如何改进?
- 如何创建适用于 lambda 表达式的排序函数
- 使用按插入方式排序的参数创建哈希映射
- (C++)如何创建一个函数来接收两个排序的链表并返回出现在两个列表中的第三个元素列表
- 使用 pair 创建priority_queue,以便在第一个元素相等时"<"第一个元素的排序,对第二个元素">"排序
- 努力将在一个函数中创建的数组传递到一个排序函数
- 如何在c++中使用两个排序标准(对于一组对)创建有序集
- 创建一个接受linkedlist作为输入的合并排序
- ICU:创建不区分大小写的排序规则
- 创建一个C++预排序迭代器,为循环提供树节点
- 我正在尝试为我的 DynamicArray 类创建一个迭代器。为什么 STL 排序不适用于我的迭代器?
- 尝试使用自定义排序创建std::map