我正在尝试制作一个包含向量的地图,但其中包含向量,但是在尝试访问元素时遇到错误。
这是我的代码:
#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下标超出范围。
答案 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
只关心一对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)
的操作,尽管它没有不适用于带有花括号的较短版本。
答案 2 :(得分:0)
当您尝试正确添加到此向量中时,您尚未添加任何内容。您正在尝试获取不存在的东西。
您需要在第一个向量中添加一些内容。
m[0].pushback();
m[0][0].pushback("hi");
或者,您可以创建要保留的向量,首先保留在第一个向量中。
vector<string> vec1;
vec1.pushback("hi");
m[0].pushback(vec1);