将字符指针按顺序存储在 map 中 std::map<char*, int> mymap。将其存储为字符或字符串不是一个选项


std::map<char*, int> mymap; 
mymap['a'] = 1; 
mymap['b'] = 2;
mymap['c'] = 3;  

如果插入顺序发生变化,如何以该特定顺序打印 1、2、3? 我不知道广告顺序。但是每次输出的顺序都应该相同。

我不知道广告顺序。但是每次输出的顺序都应该相同。

这正是std::map的工作方式。迭代器以映射比较器诱导的严格弱排序方式穿过元素。插入顺序不会影响迭代的顺序。

std::map<char*, int>如何按特定顺序打印 1、2、3。

这里的问题是映射是按键而不是按值排序的。

如果您需要按值顺序迭代映射的元素,那么似乎需要一个多索引容器。这样的容器可以由一个索引查找,并使用另一个索引进行迭代。但是,C++标准库不提供此类多索引容器。

多索引容器的想法非常简单。它由节点组成,就像列表或树一样,但每个节点包含多组链接 - 每个索引一个链接集。这种容器的通用实现并不像这个想法那么简单。

mymap['a'] = 1;

不能将char用作密钥类型为char*的映射的查找参数。

这可能是你需要的:

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意味着您始终拥有唯一键,例如,两个指针指向内存中的不同地址,但存储在这些地址中的字符是相同的,这不是您想要的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

最新更新