[英]Debug assertion failed.. C++ vector subscript out of range
以下代碼應該刪除向量中的重復值。
例如,如果vector包含{1,5,3,3}
則結果應為{1,5,3}
。
程序啟動,我輸入整數n*
。 但是,該程序會引發以下錯誤:
調試斷言失敗。程序:... \\ include \\ vector line:932表達式:向量下標超出范圍。
當我按重試時,visual c ++顯示一個新窗口:
“try.exe觸發了一個斷點”。
然后,在我單擊繼續后,出現另一個錯誤:
調試斷言失敗! 程序:... \\ include \\ vector line:933表達式:“標准c ++庫超出范圍”&& 0
我的代碼如下:
#include <iostream>
#include <vector>
using namespace std;
void removeDup (vector<int>& v);
int main()
{
vector<int> v;
int i,n;
cin>>n;
for(i=0;i<n;i++){
v[i]=rand()%10;
}
removeDup(v);
for(i=0;i<n;i++)
{
cout<<v[i];
}
system("pause");
}
void removeDup(vector<int>& v)
{
int i,j,size;
size=v.size();
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
if(v[i]==v[j])
v.erase(v.begin()+j);
}
}
}
斷言失敗實際上告訴你到底發生了什么。 你的向量是零大小的,並且你試圖索引一個空的向量(它自然會訪問超出界限的東西)。
operator[]
不會為像vector
這樣的標准序列動態創建元素,比如某些語言中的關聯數組,或者與std::map
。 傳遞給operator[]
的索引必須在[0, vector.size())
范圍內,否則它將在調試中觸發此超出范圍的斷言失敗(對於已檢查的實現)或在發布中觸發潛在的段錯誤/訪問沖突構建(基本上是未定義的行為)。 這是出於性能原因而完成的,否則它將需要在operator[]
進行分支,這通常會破壞vector
具有的與數組相當的索引性能(盡管存在一個拋出具有分支開銷的at
方法)。
在這里,您希望使用填充構造函數預先調整向量的大小,例如:
int i,n;
cin>>n;
vector<int> v(n);
...
或者在使用resize
方法使用operator[]
訪問它之前調整它的resize
:
vector<int> v;
int i,n;
cin>>n;
v.resize(n);
或者使用push_backs
:
vector<int> v;
int i,n;
cin>>n;
// can use reserve here for a performance boost if desired
// since we know the memory capacity needed in advance.
for(i=0;i<n;i++){
v.push_back(rand()%10);
}
您的removeDup
函數還有另一個問題。 那個問題在於你循環遍歷向量,好像它的大小沒有改變,但是調用一個擦除方法,它會在每次迭代時減小它的大小。 這也會調用超出范圍的訪問權限 - 也許你可以找出解決方案作為練習的一部分(我假設這是一個練習,因為std::unique
會做到這一點)。 這里要注意的第一件事可能是operator[]
不會為你動態創建元素。
我給你另一種方法來解決這個問題。(你可以使用它)。 在這里,您可以使用#include<set>
刪除重復值,如下所示:
set<int>s;
s.insert(10);
int i,n;
cin>>n;
for(i=0;i<n;i++){
s.insert(rand()%10);
}
set<int>::iterator ii;
for(ii=s.begin();ii!=s.end();ii++)
cout<<*ii;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.