如何在 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&lt;int, vector&lt;vector&lt;string&gt;&gt;&gt;,了解它们如何工作的最简单方法是将其分解。

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只关心一对intvector。 然后你有那个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++ 中创建向量的向量图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中从现有 2D 向量中创建具有特定列的新向量

如何在 C++ 中创建一个作为另一个类的向量的类?

在C++的模板类中创建向量

在递归函数 C++ 中创建向量

无法在 C++ 中创建结构向量

C++ 如何制作二维向量函数?