如何在C ++中创建向量的向量图?

时间:2018-12-04 06:49:26

标签: c++ dictionary vector

我正在尝试制作一个包含向量的地图,但其中包含向量,但是在尝试访问元素时遇到错误。

这是我的代码:

#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中:

  

调试断言失败。程序:Expression:vector下标超出范围。

3 个答案:

答案 0 :(得分:3)

m [0]在您的代码中为空向量,因此您无法访问其第一个元素(m [0] [0])。 您需要在内部创建矢量,例如

x = np.stack(orig_images, axis=0)

答案 1 :(得分:1)

这里的“问题”是您有3个嵌套容器,因此您需要向所有嵌套容器添加值以存储"hi"值。
进行m[0][0].push_back("hi");操作时,基本上是在访问0中每个vector的位置map,但是您没有在其中设置任何值,它们是空的。

我首先将其分解以更好地解释。

对于嵌套容器(例如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只关心一对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)的操作,尽管它没有不适用于带有花括号的较短版本。

答案 2 :(得分:0)

当您尝试正确添加到此向量中时,您尚未添加任何内容。您正在尝试获取不存在的东西。

您需要在第一个向量中添加一些内容。

m[0].pushback();
m[0][0].pushback("hi");

或者,您可以创建要保留的向量,首先保留在第一个向量中。

vector<string> vec1;
vec1.pushback("hi");

m[0].pushback(vec1);