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

时间:2019-06-15 16:39:48

标签: c++ stl

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

如果插入顺序被更改,如何以该特定顺序打印1、2、3? 我不知道插入顺序。但是每次的输出顺序应该相同。

2 个答案:

答案 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

相关问题