簡體   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