![](/img/trans.png)
[英]C++ - Segmentation fault. - malloc.c: No such file or directory
[英]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())
允許您調整向量的大小,如果它變得比原來大,則追加新元素 兩種方法都允許您提供要復制的元素(示例),並且如果沒有明確提供示例,則默認為復制默認的構造對象(如果T
為int
則為0
)。
除了使用push_back()存儲新元素之外,您還可以在開始使用向量指定其中包含的元素數量之前調用resize()一次。 這與分配數組非常相似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.