【问题标题】:Nested container in c++C++中的嵌套容器
【发布时间】:2021-09-29 16:36:19
【问题描述】:

我是 C++ 概念的新手,在嵌套容器中插入值时我很困惑。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    vector<vector<vector<vector<vector<int>>>>>s;
    s[0][0][0][0].push_back(5);
    return 0;
}

我的程序异常终止。

【问题讨论】:

  • s[0] 在您创建它之前不存在。一旦完成,s[0][0] 仍然不存在。等等……
  • 以非嵌套向量开始。然后嵌套向量的工作原理相同
  • 实际需要这种深度的情况很少见。你想做什么?这听起来像是关联容器和 4 元素键可能是更好的解决方案的情况

标签: c++ vector stl nested


【解决方案1】:

您必须在访问之前向每个向量插入元素。否则,您将错误地访问不存在的元素。

#include <vector>
using std::vector;
int main()
{
    vector<vector<vector<vector<vector<int>>>>>s;
    s.push_back(vector<vector<vector<vector<int>>>>());
    s[0].push_back(vector<vector<vector<int>>>());
    s[0][0].push_back(vector<vector<int>>());
    s[0][0][0].push_back(vector<int>());
    s[0][0][0][0].push_back(5);
    return 0;
}

【讨论】:

  • 或者只是 vector&lt;vector&lt;vector&lt;vector&lt;vector&lt;int&gt;&gt;&gt;&gt;&gt;s{{{{{5}}}}}; 并删除 push_back() 调用?
【解决方案2】:

您已默认初始化s。 vector 的默认构造函数会创建一个 empty 向量。

s[0] 访问向量的第一个元素。空向量没有元素。这是一个矛盾。访问向量边界之外的元素的行为是未定义的。

您可以像这样初始化一个非空向量:

std::vector<std::vector<std::vector<std::vector<std::vector<int>>>>> s
{ // std::vector<std::vector<std::vector<std::vector<std::vector<int>>>>>
    { //         std::vector<std::vector<std::vector<std::vector<int>>>>
        { //                 std::vector<std::vector<std::vector<int>>>
            { //                         std::vector<std::vector<int>>
                {5}, //                              std::vector<int>
            },
        },
    },
};

【讨论】:

    【解决方案3】:

    要么坚持使用矢量并关注eerorika's suggestion,要么在访问时选择容器默认构造元素,例如std::map

    #include <map> // don't use stdc++.h or using namespace std
    int main()
    {
        template<class T>
        using map = std::map<std::size_t, T>;
    
        map<map<map<map<map<int>>>>> s;
        s[0][0][0][0][0] = 5;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多