【问题标题】:How to access an index in a vector without segfaulting如何在没有段错误的情况下访问向量中的索引
【发布时间】:2011-12-20 01:53:47
【问题描述】:

我知道这很简单,所以我提前道歉。

尝试按索引访问向量时出现段错误。比如……

vector<float> some_vec;
int i = 0;

for (some iterator loop here)
{
    //snip
    some_vec[i] = some_float;
    i++;
}

我做错了什么?

【问题讨论】:

  • 谁能说?这取决于some iterator loop here//snip 中的实际代码。循环中的迭代器范围是否为空?你有没有调整some_vec 的大小?当你得到的每一个答案都是猜测时,这很好地表明了一个不好的问题......
  • www.debug-my-code-for-me.com/i-wont-show-you-it-though.html
  • 你们怎么了?这是一个几乎开箱即用的可编译重现,很可能会导致斑马描述的运行时错误,并且可以很容易地回答。根本不需要投票和/或关闭。
  • ¤ 您只需要确保some_vec.size() 大于您的索引,即在该索引处确实有 is 向量元素。作为一个新手,您可能会从编写v.at(i) 而不是v[i] 中受益,因为at 会进行范围检查,如果不正常则抛出异常,保证。作为后来的专业人员,您可能会为了更实用(但通常不保证)检测和更易读的源代码而牺牲保​​证。 :-) 干杯&hth.,

标签: c++ vector


【解决方案1】:

之后

std::vector<float> some_vec;

你的向量是空的。你不能访问其中的任何元素,因为没有任何元素。

如果要将值放入其中,则需要使用 push_back() 将它们附加到向量中

for (some iterator loop here)
{
    //snip
    some_vec.push_back(some_float);
    i++;
}

或者,如果您提前知道大小,并且向量中的虚拟值的构造很便宜(就像 float 和其他内置函数一样),您可以提前resize() 向量

some_vec.resize(42);

或使用适量的元素创建它

std::vector<float> some_vec(42);

鉴于以上两个中的任何一个,您就可以访问向量中的元素0..41

【讨论】:

    【解决方案2】:

    在你的向量上调用 resize() 函数,然后调用 push_back() 来添加元素。在此之后,您可以使用索引访问元素。

    【讨论】:

      【解决方案3】:

      可能是我们看不到的代码中其他地方的问题,但很可能是因为您没有调用resize()push_back()insert()i 在向量之外。使用some_vec.at(i) = some_float; 检查i 是否在向量的有效范围内。

      【讨论】:

        【解决方案4】:

        我猜你的vector 是空的。使用push_back(some_float) 向其中添加元素。

        【讨论】:

        • 我不能在不推回的情况下最初在索引 0 处分配吗?我一直认为你可以,嗯。
        • @zebra :如果向量为空,则不会...您为什么希望它起作用?
        • 为此,您需要知道向量的项目数,并相应地对其进行初始化。例如,如果您知道您将有十个项目,请将您的向量声明为vector&lt;float&gt; some_vec(10);
        • 好的,那就是答案。我想我记得如果您尝试分配一个高于当前大小的索引,它会将它推回给您。
        猜你喜欢
        • 2017-11-19
        • 1970-01-01
        • 2018-11-13
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 2012-08-11
        • 2011-11-05
        相关资源
        最近更新 更多