繁体   English   中英

陷入了简单的分段错误。 C ++

[英]Stumped at a simple segmentation fault. C++

有人可以解释一下为什么这给了我一个分割错误吗?

#include <vector>
#include <iostream>

using namespace std;

vector <double>freqnote;

int main(){

freqnote[0] = 16.35;

cout << freqnote[0];

return 0;
}

我在代码中还有其他向量,这是似乎给我带来麻烦的唯一向量。

我将其更改为vector<int>freqnote; 并将其值更改为16,我仍然会遇到细分错误。 到底是怎么回事?

我还有其他向量整数,它们给我正确的结果。

更换

freqnote[0] = 16.35;

freqnote.push_back(16.35);

你会没事的。

该错误是由于该索引超出范围。 当您通过[0]访问第一个元素时,向量的容量可能为0。另一方面, push_back()会扩展向量的容量(如有必要)。

您不能初始化矢量中的元素。

你得走了:

freqnote.push_back(16.35),

然后像访问数组一样访问它

您正在访问向量。 首先,您需要初始化向量以指定其大小。

int main() {
    vector<int> v(10);
    v[0] = 10;
}

如前所述,这是在vector插入超出范围的索引的问题。

vector是一个动态大小的数组,它的大小从0开始,然后您可以根据自己的喜好扩展/缩小vector

有两种通过索引访问vector元素的方法:

  • vector::operator[](size_t) (仅限专家)
  • vector::at(size_t)

(我省去了const重载)

两者都有相同的语义,但是第二个是“安全的”,因为它将执行边界检查并在您越界的情况下抛出std::out_of_range异常。

我会热烈建议执行所有访问使用

对于大多数用例,可以忽略性能损失。 operator[]仅应在专家对代码进行概要分析并证明存在瓶颈后,才能使用。

现在,要在vector插入新元素,您有几种选择:

  • push_back将追加一个元素
  • insert将在iterator指向的元素前面插入元素

根据您希望的语义,将两者都考虑在内。 当然,两者都会使vector适当增长。

最后,您还可以显式定义大小:

  • vector(size_t n, T const& t = T())是构造函数的重载,可让您指定大小
  • resize(size_t n, T const& t = T())允许您调整向量的大小,如果它变得比原来大,则追加新元素

两种方法都允许您提供要复制的元素(示例),并且如果没有明确提供示例,则默认为复制默认的构造对象(如果Tint则为0 )。

除了使用push_back()存储新元素之外,您还可以在开始使用向量指定其中包含的元素数量之前调用resize()一次。 这与分配数组非常相似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM