Python 到 C++ 的字典列表
Posted
技术标签:
【中文标题】Python 到 C++ 的字典列表【英文标题】:Python List of Dictionaries to C++ 【发布时间】:2019-12-27 10:13:23 【问题描述】:我有一个 Python 字典列表,我想将其翻译成 C++。
我的列表或多或少是这样的:
myList = ["v_A": 5, "v_B": 3, "v_A": 1, "v_B":2, "v_A":0, "v_B": 0]
我的代码是这样设计的,当我寻找例如粒子0的速度,我知道:
v = myList[0]["v_"+letter]
其中letter
将是一个字符串"A"
或"B"
,这取决于我拥有的排序函数的输出。我发现这是在 Python 中实现我的目的最方便的方法。
我正在尝试将我的代码翻译成 C++(有点新手),但我不知道如何保留类似“字典”的功能(即,通过可以构建的键访问值连接字符串)以及列表的好处,如myList
。
我没有成功阅读这个问题,无法理解:C++ Equivalent of Python List of Dictionaries?
经过一些研究,我想到了使用无序地图的向量,但我不确定如何定义它并使用它。我想到了:
vector< unordered_map <string, int >> myList;
但是,我总是遇到错误。此外,我不知道如何在字典中引入值或访问元素。我是从一个完全错误的角度来处理这个问题吗?
编辑: 我发现如果我逐段定义和插入元素,它似乎可以工作:
std::vector <unordered_map <string, int> > myList;
unordered_map <string, int> tempMap;
tempMap.insert(std::make_pair("v_A", 10));
myList.push_back(tempMap);
cout << myList[0]["v_A"];
正确返回10
。有没有办法以更有效/更简单的方式做到这一点?
【问题讨论】:
什么错误?用什么代码?请提供minimal reproducible example 以显示您到目前为止所做的尝试 请说明您尝试了什么以及这些错误是什么。虽然尚不清楚这是否是 C++ 中解决问题的最佳方法,但您展示的定义应该可以工作,并且几乎可以像在 Python 中一样使用。 【参考方案1】:在列表中插入可以更简单。
在初始化时你可以这样做
std::vector<std::unordered_map<std::string, int>> myList
"v_A", 5, "v_B", 3,
"v_A", 1, "v_B", 2,
"v_A", 0, "v_B", 0
;
您稍后可以使用push_back
增加向量的大小:
myList.push_back("v_A", 0, "v_B", 0);
或者您可以使用与 python 相同的方式将现有元素之一添加到字典中:
myList[0]["v_C"] = 12;
您不能以这种方式将元素添加到向量中。 (越界访问向量会导致未定义的行为。)
可以使用myList[0]["v_C"]
像在 Python 中一样读取元素。
您不能像v = myList[0]["v_"+letter]
那样直接使用+
将字符或C 样式字符串连接到字符串文字(取决于letter
的类型,它可能会编译,但可能不会按照您的预期执行) .但是如果你使用
using namespace std::string_literals;
在您的.cpp
文件中包含之后,您可以编写
v = myList[0]["v_"s+letter];
s
后缀随后会将字符串文字转换为 std::string
,它提供了一个实际执行连接的 +
运算符。
【讨论】:
感谢您提供有关如何添加字符串的建议!很有帮助!【参考方案2】:使用std::unordered_map
,您可以使用operator[]
,如果该元素不存在,它将被插入到地图中。
这不适用于向量。向量是一个动态数组,您需要先向其中显式添加元素,然后才能使用operator[]
访问已添加的元素。
std::vector<std::unordered_map<std::string, int>> myList;
myList[0]; // Invalid since the vector currently is empty.
myList.push_back(); // Insert a default-constructed element in the vector
myList[0]; // Refers to the first element in the vector, which is a std::unordered_map<std::string, int>
myList[0]["string"] = 1; // This will create the elements if it does not already exist at mentioned above so this works fine
如果您知道希望向量具有的大小,可以使用std::vector::resize
或调用构造函数来设置大小。
std::vector<std::unordered_map<std::string, int>> myList(10);
// Create a vector with 10 elements, so [0-9] would be in-bounds.
std::vector<std::unordered_map<std::string, int>> myList;
myList.resize(10); // This will do the same thing but in two steps.
【讨论】:
以后我会牢记这一点,谢谢您的建议!【参考方案3】:std::vector<std::unordered_map<std::string, int>> dictList; // This is a list of dicts
std::unordered_map<std::string, int> dict; // Here we create a specific dict we want to add to our list of dicts
dict["key"] = 10; // This is how you add (key, value) pair into dict in c++
dictList.push_back(dict); // This is how you add your dict to the list of dicts
【讨论】:
最好使用push_back(std::move(dict))
— 或者使用dictList.emplace_back()
创建一个新的空地图在向量中,然后在那里填充它。以上是关于Python 到 C++ 的字典列表的主要内容,如果未能解决你的问题,请参考以下文章