如何在 C++ 中创建向量的向量图?
Posted
技术标签:
【中文标题】如何在 C++ 中创建向量的向量图?【英文标题】:How to create a map of vectors of vectors in C++? 【发布时间】:2018-12-04 06:49:25 【问题描述】:我正在尝试制作一个包含矢量的地图,但在尝试访问元素时出现错误。
这是我的代码:
#include <iostream>
#include <map>
#include <vector>
#include <string>
using namespace std;
int main()
map<int, vector<vector<string>>> m;
m[0][0].push_back("hi");
return 0;
你可以在这里试试:https://onlinegdb.com/HytLmjQJV
我得到的错误是在 Visual Studio 中:
调试断言失败。程序:表达式:向量下标超出范围。
【问题讨论】:
欢迎来到 Stack Overflow。请阅读the help pages,尤其是"What topics can I ask about here?" 和"What types of questions should I avoid asking?"。还有take the tour 和read about how to ask good questions 和this question checklist。最后,请告诉我们错误(复制粘贴到问题本身)。 @Someprogrammerdude 编辑了我的问题。希望越来越好。 【参考方案1】:m[0] 在您的代码中是一个空向量,因此您无法访问它的第一个元素 (m[0][0])。 你需要在里面创建一个向量,例如
m[0].push_back();
m[0][0].push_back("hi");
【讨论】:
仅供参考 --m.insert(0, "hi");
也有效。如果您想在键 0 处向向量添加多个字符串:m.insert(0, "hi","there","everyone");
【参考方案2】:
这里的“问题”是您有 3 个嵌套容器,因此您需要向所有容器添加值以存储您的 "hi"
值。
当你这样做m[0][0].push_back("hi");
时,你基本上是在访问map
中每个vector
的位置0
,但是你没有在它们中设置任何值,它们是空的。
为了更好的解释,我先分解一下。
对于嵌套容器,例如 map<int, vector<vector<string>>>
,了解它们如何工作的最简单方法是将其分解。
map<int, vector<vector<string>>> m;
vector<string> inner; // Inner vector
vector<vector<string>> outer; // Outer vector
inner.push_back("Hi"); // Inner vector value
outer.push_back(inner); // Outer vector value
// Map holds pairs
m.insert(pair<int, vector<vector<string>>>(10, outer));
// Accessing data
cout << m[10][0][0] << endl;
输出
> Hi
简化
也就是说,您可以更轻松、更干净地编写这样的内容。
m.insert(20, "Hi2");
// Accessing data
cout << m[20][0][0] << endl << endl;
输出
> Hi2
第一组花括号20, ...
是插入map
的对。把它想象成map
只关心一对int
和vector
。
然后你有那个vector
,外花括号...
,知道它还有另一个vector
。
这个vector
,内花括号""
,知道它有字符串。
基本上使用花括号,我们所做的与上述相同,为每个容器、一对和两个向量创建单独的值。
扩展
然后您可以使用更多数据轻松扩展它。
m.insert(25, "Hi2", "Hi3", "Hi4", "By1", "By2");
// Accessing data
cout << m[25][0][0] << endl;
cout << m[25][0][1] << endl;
cout << m[25][0][2] << endl << endl;
cout << m[25][1][0] << endl;
cout << m[25][1][1] << endl;
输出
> Hi2
> Hi3
> Hi4
>
> By1
> By2
注意
您可以检查项目 here 以查看它是否正常工作。
同样在 c++ 中,map
没有push_back()
,但如果您想要类似的东西,您可以使用emplace()
并执行类似m.emplace(20, outer)
的操作,尽管它不适用于带有花括号。
【讨论】:
【参考方案3】:当您尝试正确添加到此向量时,您没有向向量中添加任何内容。你试图抓住不存在的东西。
你需要在第一个向量中放一些东西。
m[0].pushback();
m[0][0].pushback("hi");
或者,您可以先创建要保存在第一个向量中的向量。
vector<string> vec1;
vec1.pushback("hi");
m[0].pushback(vec1);
【讨论】:
以上是关于如何在 C++ 中创建向量的向量图?的主要内容,如果未能解决你的问题,请参考以下文章