C++映射返回基于变量键的类对象
C++ Map returning class object based on variable key
我重新学习了地图结构,我正在尝试使用它,但似乎无法解决一个问题。
我已经尝试了以下代码:
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;
}
- 你能重载对象变量名本身返回的内容吗
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何使用std::lower_bound比较对象变量,而不使用第二个对象进行比较
- 将私有对象变量与用户输入的变量进行比较
- 具有已定义操作重载的 C++ 非类型化值对象/变量库
- 如何对对象数组进行排序,而不考虑对象变量类型
- 在功能中设置对象变量
- 如何创建对象变量,以便每次分配新的指针
- C++ FileIO 以读取和写入对象变量
- 私下声明的对象变量的突变器/访问器方法
- C++ 列表中的对象变量在迭代过程中不会更新
- 稍后使用私有对象变量时如何初始化数组(初始化对象后)
- 通过向量更改对象变量的值
- C 全局对象变量内存释放
- 基本数据类型变量 VS 对象变量
- C 复制分配运算符,用于参考对象变量
- c++从列表中移除元素,并将其分配给对象变量
- 我们是否需要在C++中同步局部对象变量
- 点运算符和箭头运算符之间的区别 结构对象变量 在 C 或 C++ 中创建树
- 无法访问在 std 回调中传递的对象变量