std::map<char*, int> mymap;
mymap['a'] = 1;
mymap['b'] = 2;
mymap['c'] = 3;
如果插入顺序被更改,如何以该特定顺序打印1、2、3? 我不知道插入顺序。但是每次的输出顺序应该相同。
答案 0 :(得分:2)
我不知道插入顺序。但是每次的输出顺序应该相同。
这正是std::map
的工作方式。迭代器按照映射图的比较器所诱导的严格弱顺序遍历元素。插入顺序不影响迭代的顺序。
std::map<char*, int>
如何以特定顺序打印1、2、3。
这里的问题是,映射是通过键而不是值来排序的。
如果您需要按值顺序遍历地图的各个元素,则似乎需要一个多索引容器。可以通过一个索引查找此类容器,并使用另一个索引进行迭代。但是,C ++标准库不提供此类多索引容器。
多索引容器的想法非常简单。它由节点组成,就像列表或树一样,但是每个节点包含多组链接-每个索引一组。这种容器的通用实现并不像这个想法那么简单。
mymap['a'] = 1;
您不能将char
用作键类型为char*
的映射的查找参数。
答案 1 :(得分:1)
这可能是您需要的:
std::map<char, int> mymap;
mymap.emplace(make_pair('a', 1));
mymap.emplace(make_pair('c', 3));
mymap.emplace(make_pair('b', 2));
for(auto& it : mymap)
cout<<it.second<<endl;
map是根据键而不是值进行排序的。如果您需要大小可变的char
,请使用string
如果char*
不是可选的,请使用shared_ptr
:
std::map<std::shared_ptr<char>, int> mymap;
mymap.emplace(make_shared<char>(char('a')), 1);
您在这里遇到的主要问题是插入一个指针,如key
表示您始终具有唯一键,例如,两个指针指向内存中的不同地址,但存储在这些地址中的char是相同的,不是您想从map
获得。
如果您希望根据值对它进行排序,只需更改键和值即可。
按值对地图进行排序:
#include <iostream>
#include <memory>
#include <algorithm>
#include <map>
using namespace std;
template<typename A, typename B>
std::pair<B,A> flip_pair(const std::pair<A,B> &p)
{
return std::pair<B,A>(p.second, p.first);
}
template<typename A, typename B>
std::multimap<B,A> flip_map(const std::map<A,B> &src)
{
std::multimap<B,A> dst;
std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()),
flip_pair<A,B>);
return dst;
}
int main(void)
{
std::map<std::shared_ptr<char>, int> mymap;
std::shared_ptr<char> a;
a.reset(new char('a'));
std::shared_ptr<char> b;
b.reset(new char('b'));
std::shared_ptr<char> c;
c.reset(new char('c'));
mymap.emplace(make_pair(a, 1));
mymap.emplace(make_pair(c, 2));
mymap.emplace(make_pair(b, 3));
std::multimap<int, std::shared_ptr<char>> dst = flip_map(mymap);
// dst is now sorted by what used to be the value in src!
for(auto& it : dst)
cout<<it.first<<endl;
}
按值对地图进行排序的积分:https://stackoverflow.com/a/5056797/10933809