【问题标题】:How to create a map of vectors of vectors in C++?如何在 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 中:

调试断言失败。程序:表达式:向量下标超出范围。

【问题讨论】:

标签: c++ dictionary vector


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      相关资源
      最近更新 更多