C++映射返回基于变量键的类对象

C++ Map returning class object based on variable key

本文关键字:对象 变量 返回 映射 于变量 C++      更新时间:2023-10-16

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

我已经尝试了以下代码:

map<string, valuePair> translator;

类valuePair只是两个对象(字符串和一个数字)的组合。

我正在为地图赋值

translator[currentWord] = valuePair(stateNo, "state");

其中currentWord是变量字符串,stateNo是int。

现在以后我想从地图上取回valuePair数值,但可以;我似乎做不到。这是我的观察窗口试图访问变量x的屏幕截图。https://i.stack.imgur.com/ccask.png

这些都是我设法在网上找到的返回价值的方法,但似乎都不起作用。正如你所看到的,钥匙"a"在地图上。我做错了什么?

[编辑]谢谢大家,我用了你们在评论中给出的提示,发现实际上它按照我预期的方式工作——translator["a"].x打印了我需要的值。不过,我没有什么可以标记为"正确答案",我不确定现在该如何处理这个线程:/

正如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;
}

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

对于std::map,您必须始终考虑您要查找的密钥实际上不包含在映射中的情况!

要查找存储在给定密钥下的值,必须使用std::map::find(链接)。

示例:

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(链接)可以是C++11的替代方案。但是,当您使用映射中不存在的键时,您必须处理可能引发的异常。

这对我有效

#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;
}