2011-02-11 93 views
6

我有这样的地图:通过索引访问地图值?

m.insert(pair<int, string>(10, "map1")); 
m.insert(pair<int, string>(11, "map2")); 
m.insert(pair<int, string>(12, "map3")); 
m.insert(pair<int, string>(13, "map4")); 
m.insert(pair<int, string>(14, "map5")); 

然后,我让用户输入一个数字:

Please select: 
1. Map1 
2. Map2 
3. Map3 
4. Map4 
5. Map5 

让我们说,如果用户输入3,我如何才能值:12?

+0

您是否得到了正确的要求?我想你知道价值就需要钥匙。 – Jagannath 2011-02-11 03:34:12

+0

如果该对中的整数是您的值,那么您的键值对以相反的顺序排列。它应该是`对`。然后,如果用户选择“3”,那么你可以像这样获取它:`m [string(“map”)+ string(itoa(selection))]``。 – yasouser 2011-02-11 04:26:50

回答

3

std::map不跟踪其元素的插入顺序;元素按排序顺序而不是插入顺序存储。如果您需要跟踪插入元素的顺序,则需要自行完成。这样做的一种方法是将保持存储在顺序按键的第二容器,使用std::vector,例如:

std::vector<int> insertion_order; 

m.insert(std::make_pair(10, "map1")); 
insertion_order.push_back(10); 

然后,插入元件的N个的关键是在索引N - 1insertion_order序列。

0

从文档:

比较:比较等级:A类,它的键类型的两个参数,并返回一个布尔值。表达式comp(a,b),其中comp是此比较类的一个对象,a和b是关键值,如果在严格的弱排序操作中将a放置在比b更早的位置,则返回true。这可以是实现函数调用操作符的类或指向函数的指针(请参阅示例的构造函数)。 默认为less<Key>,与应用小于运算符(a<b)的返回值相同。 地图对象使用此表达式来确定容器中元素的位置。地图容器中的所有元素始终按照此规则排序。

所以map类并不像数组那样维护其元素的顺序。如果有索引运算符,它会想而不是返回添加到地图的第i个元素。它是一个关联集合,当您需要凭借插入时间来维护订单时,您通常不会使用该类型的数据结构。

4

使用目前的设置,有没有简单的方法来做到这一点;你必须迭代地图的所有元素,寻找具有Map3值的元素。

map针对在一个方向上查找关系进行了优化。给定一个map<K, V>,你可以很容易地从K s映射到V s,但不是相反。原因是因为您可以将任何V作为价值存储,所以不能保证您会得到唯一的逆转。也就是说,给定此地图:

0 -> 0 
1 -> 0 
2 -> 1 

有没有有意义的方式来说哪个键的值为0;有两个这样的键,0和1.

在这里有很多选项。首先,您可以打开map,而将字符串与整数相关联,而不是整数与字符串相关联。根据你的用例,这看起来像你想要做的第一件事。如果你这样做,那么你可以只用方括号运算符来查找相关的值:

cout << m["Map3"] << endl; 

或者,如果你担心会缺少价值观发生什么,那么你可以写

map<string, int>::iterator itr = m.find("Map3"); 
if (itr != m.end()) { 
    /* ... use itr to read the values ... */ 
} 

或者,如果您确实必须将整数映射到字符串,并且您知道每个整数都与唯一字符串配对,反之亦然(即映射是双映射),那么您可以使用一个Boost.Bimap来编码这种双向关系。这将使得在键和值之间来回切换变得非常容易。

希望这会有所帮助!

2

将菜单中的整数映射到您希望存储的数据。考虑:

struct data { 
    data(int n, const std::string& s) : s(s), n(n) { } 
    std::string s; 
    int n; 
}; 

// ... 
std::map<int,data> m; 
m.insert(make_pair(1, data(10, "Map1")); 
m.insert(make_pair(2, data(11, "Map2")); 
m.insert(make_pair(3, data(12, "Map3")); 

int n = m[3].n; // 12