簡體   English   中英

調試斷言失敗.C ++向量下標超出范圍

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM