2010-08-30 71 views
1

有人可以善意的解释为什么在这个世界上这给我一个分段错误的错误?陷于简单的分段故障。 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和我仍然得到分段错误。到底是怎么回事?

我有其他向量ints,他们给我正确的结果。

+0

Dude !! ..你需要修改插入元素到vector中的技能.vector与c中的数组不同。 – Vijay 2010-08-30 10:43:31

+0

如果是VS2010,它会在调试模式下给出一个明确的错误消息,说明下标超出范围 – Chubsdad 2010-08-30 11:29:23

+0

为什么您认为将int更改为double会消除分段错误? – 2010-08-30 15:48:18

回答

2

你正在访问向量越界。首先,您需要初始化指定尺寸的矢量。

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

你能否向我解释其他载体如何在没有指定大小的情况下给我任何问题? 此外,我有一个长向量(0-107向量)指定的大小为108,仍存在分段错误。这是怎么回事? – Tek 2010-08-30 10:40:45

+0

您可能已经在不同的环境中使用过它们。例如,您可能使用push_back添加元素,或插入函数。如果你给出了实际的代码示例,那么我可以发表评论。分段错误也可能是由于完全不同的原因。 – Leonid 2010-08-30 10:42:18

+0

你不应该真的声明这样的元素,它更好地使用push_back()语法。 – Tomas 2010-08-30 10:43:05

10

更换

freqnote[0] = 16.35; 

freqnote.push_back(16.35); 

,你会没事的。

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

7

你不能初始化一个像这样的矢量元素。

你必须去:

freqnote.push_back(16.35), 

然后访问它,你会数组

2

正如人们所说的,它是关于在vector插入超出范围的指标的问题。

一个vector是一个动态大小的数组,它从一个大小为0,然后你可以扩展/在你的心脏收缩的内容它。

有由索引访问vector元件的2种方式:

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

(I分配与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())允许您调整向量,追加新的元素,如果它得到的构造函数的重载大于它

两种方法允许你提供一个元件被复制(示例性)和默​​认复制默认构造的对象(如果0Tint),如果你没有明确提供范例。

0

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