C ++ Map基于变量键返回类对象

时间:2014-04-15 13:39:45

标签: c++ map

我重新学习了地图结构,我正在尝试使用它,但似乎无法解决一个问题。

我尝试过以下代码:

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;虽然,我现在不知道如何处理这个帖子:/

3 个答案:

答案 0 :(得分:2)

如果您有std::map<K,V> m;,则可以使用m[k] = v;添加元素并更改值。但是,operator[]是一个始终创建键/值对的操作,如果您要查找的键未包含在地图中。因此,当你有一个const引用或指针时,不允许这样做,例如const std::map<K,V>&

使用std::map时,您始终必须考虑您要查找的密钥实际上未包含在地图中的情况!

要查找存储在指定键下的值,您必须使用std::map::findlink)。

示例:

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::atlink)可能是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;
}