在std::map中排序,其中key是std::字符串
sorting in std::map where key is a std::string
我有一个std::map mymap
现在,如果我在映射中插入值:
std::map <string, string> mymap;
mymap["first"] = "hi";
mymap["third"] = "how r you";
mymap["second"] = "hello";
现在我想遍历映射并以sorted(keys)方式打印值:
map<string, string>::iterator itr;
for(itr = mymap.begin(); itr != mymap.end(); itr++)
{
string newline = itr->second;
cout << newline << endl;
}
输出应该是:
hi
hello
how r you
我认为默认情况下映射存储在排序键的方式,但我得到相同的输出顺序,因为我在输入。我是否需要为此提供我的排序函数,或者需要在迭代映射之前做一些额外的事情?
std::map
中的元素(默认情况下)按operator<
应用于键来排序。
你发布的代码,与小编辑,为我工作,正如你所期望的:
std::map <string, string> mymap;
mymap["first"]="hi";
mymap["third"]="how r you";
mymap["second"]="hello";
for (std::map<string, string>::iterator i = mymap.begin(); i != mymap.end(); i++)
{
cout << i->second << "n";
}
打印:
hi
hello
how r you
map
实际上是一个树,并按KEY顺序排序。您正在打印itr->second
,它是VALUE而不是KEY。如果您希望键/值对按value排序,请使用value作为键,或者将所有内容存储在另一个容器中(例如数组),然后对它们进行排序。
std::map已被排序。如果您使用的是unordered_map,那么现在就有问题了!
std::map中的项按键排序,或者按itr->优先。Itr ->second表示与键相关联的值。
更进一步,你不是在map上迭代,你是在file_line上迭代(我不知道那是什么,但我假设它不同于mymap。
标准定义:
关联容器的迭代器的基本属性是遍历容器在键的非降序中,其中非降序是由使用的比较定义的构造。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- std::<key-value>不同类型的对向量
- std::set<Key,Compare,Allocator>::find() 函数使用"<"运算符而不是"=="运算符背后的直觉是什么?
- std::move(key) 同时迭代unordered_map<字符串,字符串>?
- 如何计算C++中非重复值的数量 std::map<Key,Values>
- SWIG:包装 std::map<key 时编译器错误,val *>
- 使用 std::transform 将 std::vector<struct{key; val;}> 转换为 std::map<key, val>
- C++ - (零成本?) 代理类运算符=(值) -> std::map[key]=类内的值
- emplace(std::move(key), std::move(value)) vs emplace(std::ma
- 为什么 std::map 没有 insert(key &k, val &v) 类型的插入函数
- 获取最接近key的std::container::迭代器
- 如何约束模板参数以符合std::map中的Key
- 在std::map中排序,其中key是std::字符串
- 如何专门化无<Key>序容器中用户定义类型的 std::hash::operator()?
- 以指向成员的指针作为比较器/"key"的 STD 算法
- std::unordered_map::find和count以key为参数无法编译