【问题标题】:Set size of vector of vectors at run time在运行时设置向量向量的大小
【发布时间】:2016-05-07 10:17:34
【问题描述】:

我想知道,如何在运行时设置向量向量的大小。

如果我有固定尺寸,我通常会这样做

std::vector<std::vector<int>> ref(5);

然后我通过

推送特定向量中的元素
ref[i].push_back(23); // i = 0,1,...4

现在如果有兴趣在运行时设置大小,意味着我想通过命令行参数获取大小,并以与上述相同的方式推送元素。

我想通过保持打开来声明向量的向量来做到这一点

std::vector<std::vector<int>> ref;

然后推送元素

ref[i].push_back(23);

但我肯定是错的,因为我得到了错误

分段错误(核心转储)

【问题讨论】:

  • 初始化向量std::vector<:vector>> ref{{}}
  • 是为特殊的东西设置尺寸吗?
  • 只是一个小注释 i = 1..5,ref[i] 会出现段错误,索引在 C++ 中从零开始,所以 i 的范围必须是 0..4。

标签: c++ vector initialization


【解决方案1】:

我想通过命令行参数获取大小,并以与上面相同的方式推送元素。

在询问i之前询问用户最大尺寸:

cout << "What is the size of your vector? ";
int size;
cin >> size;
std::vector<std::vector<int>> ref(size);

现在您可以请求i,将它们与size 核对,然后调用ref[i] 而不会崩溃。

【讨论】:

  • 为什么允许std::vector&lt;std::vector&lt;int&gt;&gt; ref(size);?为什么不需要动态分配?您能否解释一下或将我链接到合适的问题。
【解决方案2】:

您可以使用std::vector::resize。如果输入大小大于向量的当前大小而不改变向量的内容,它会增加向量的容量。 (它可能会重新分配向量,但这不会影响您的程序)

像你一样初始化向量:
vector&lt;vector&lt;int&gt; &gt; ref;

现在,当您向后推时,请检查 i 是否在矢量的当前大小范围内。如果没有,请调整std::vector 的大小,然后调用std::vector::push_back

if(i>=ref.size())
    ref.resize(i);
ref[i].push_back(23);

【讨论】:

    【解决方案3】:

    你一直保持打开状态很好,你只是忘记了初始化。

    std::vector<std::vector<int>> ref{{}}
    

    编辑:当然,如果你想让 ref 增长,你还需要在其中推回向量:

    std::vector<int> v1;
    ref.push_back(v1);
    

    那么,

    ref[1][0]=23.
    

    【讨论】:

    • 它只适用于一个向量 ref[0] ,之后是terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
    • 我提出的解决方案并不神奇。您可以使 ref 增长而无需设置其大小 - 正如所提出问题的最后一部分 - 但当然您需要添加必要的 push_back。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2013-09-12
    • 1970-01-01
    • 2020-02-15
    • 2017-05-23
    • 1970-01-01
    相关资源
    最近更新 更多