我重新学习了地图结构,我正在尝试使用它,但似乎无法解决一个问题。
我尝试过以下代码:
map<string, valuePair> translator;
class valuePair只是2个对象(字符串和数字)的组合。
我为地图分配值
translator[currentWord] = valuePair(stateNo, "state");
其中currentWord是变量字符串,stateNo是int。
现在我想从地图中找回valuePair值,但是可以看起来能够做到。 下面是我的观察窗口的屏幕截图,试图访问变量x。 http://i.imgur.com/m3MOgi2.png
这些是我设法在线找到返回价值的所有方法,但它们似乎都不起作用。你可以看到关键的&#34; a&#34;在地图上。我做错了什么?
[编辑]谢谢大家,我使用了你在评论中给出的提示并发现,实际上它的工作方式与我预期的一样 - 翻译[&#34; a&#34;]。x打印我需要的值。我没有什么可以标记为&#34;正确答案&#34;虽然,我现在不知道如何处理这个帖子:/
答案 0 :(得分:2)
如果您有std::map<K,V> m;
,则可以使用m[k] = v;
添加元素并更改值。但是,operator[]
是一个始终创建键/值对的操作,如果您要查找的键未包含在地图中。因此,当你有一个const引用或指针时,不允许这样做,例如const std::map<K,V>&
。
使用std::map
时,您始终必须考虑您要查找的密钥实际上未包含在地图中的情况!
要查找存储在指定键下的值,您必须使用std::map::find
(link)。
示例:
std::map<std::string,valuePair>::const_iterator it = translator.find(currentWord);
if(it != translator.end()) {
// the map contains an element with this key
const valuePair& value = it->second; // this is the value
}
else {
// the map *does not* contain an element with this key
}
正如评论中所提到的std::map::at
(link)可能是C ++ 11的替代方案。但是,当你使用地图中不存在的密钥时,你必须处理可能的异常。
答案 1 :(得分:2)
正如Jonathan Henson在评论中所说,发布代码比调试器输出更好。理想情况下,您需要一个简单的示例来重现您所遇到的错误。
根据调试器输出,我想知道您是否有范围问题 - 您正在尝试访问您定义范围之外的地图数据。虽然没有看到源代码,但没有办法知道。
这是一个工作示例,它正是您正在尝试做的事情。唯一的修改是我使用了valuePair的结构和c ++ 11初始化列表。这不会影响地图访问代码,但您可能需要启用c ++ 11支持来编译它。
作为第一步,请在调试器中查看它,看看是否遇到了同样的困难。如果是这样,您的问题是调试器或调试器设置,而不是您的代码。
如果调试器适用于示例代码(在下面发布),请逐渐将我的代码转换为代码(进行最少的更改,构建,并查看它是否仍然有效)。这是学习语言优点的一种非常有用的方法。
#include <iostream>
#include <map>
#include <string>
using namespace std;
struct valuePair
{
int num;
string str;
};
int main()
{
map<string, valuePair> translator;
translator["a"] = {0,"bla"};
translator["b"] = {1, "alb"};
translator["c"] = {2, "lab"};
valuePair res = translator["c"];
cout << "c:" << res.num << "," << res.str << "\n";
res = translator.at("b");
cout << "b:" << res.num << "," << res.str << "\n";
res = translator.find("a")->second;
cout << "a:" << res.num << "," << res.str << "\n";
return 0;
}
答案 2 :(得分:-2)
这对我有用
#include <map>
#include <sstream>
#include <string>
int main()
{
std::map<std::wstring, double> items;
items[L"0"] = 0.123;
items[L"1"] = 1.234;
items[L"2"] = 2.234;
items[L"3"] = 3.345;
items[L"4"] = 4.567;
for (int i = 0; i < 5; i++)
{
std::wstringstream oss;
oss << i;
std::wstring key = oss.str();
double value = items[key];
}
return 0;
}