2011-09-08 11 views
-1

私はここで非常にシンプルなものを見落としているように感じますが、リストに挿入/スプライスをテストするためのコードをいくつか作成しましたが、私が作成したコードにseg-faultがあります。誰かが私にどこに/なぜ言ってもらえますか?Segfaultとリスト挿入?

#include <iostream>  
#include <vector> 
#include <list> 

using namespace std; 
int main(){ 

vector <int> iVec; 
list <int> iList; 
vector<int>::iterator vIt; 
list <int>::iterator lIt; 

for(int i = 0; i < 10; i++){ 
    iVec.push_back(i*10); 
    iList.push_back(i*10); 
}//0, 10, 20, 30....90 


//0 <-- current pos of iterator lIt 

lIt++; 
lIt++; 

//0, 10, 20 

iList.insert(lIt, 3); 



//Vector output loop 
for(vIt = iVec.begin(); vIt!= iVec.end(); vIt++){ 

} 



cout << endl << endl <<"List Contents: " <<endl << endl; 
//List output loop 
for(lIt = iList.begin(); lIt != iList.end(); lIt++){ 
    cout << *lIt << endl; 
} 


return 0; 

}

+4

イテレータを初期化していません。 'list :: iterator lIt = iList.begin()' – spraff

+1

@spraffあなたが回答として投稿した場合、私たちは投票できます! – Nim

+0

デバッガでコードを実行しようとしましたか?あなたは何を見たの? – Johnsyweb

答えて

5

lItが正しく初期化されていない - それはイテレータである - しかし、現在は何を指していません - あなたはこれを実行する必要があります。

lIt = iList.begin(); // initialize it to begin, now we can iterate! 
+1

ああ、私はばかだよ!今まで私はループの中で出力目的でイテレータを使っていましたので、私はそれを初期化しなかったとは思わなかった!!ありがとう! – HunderingThooves

+2

関数の先頭に変数を宣言するのは、古風なCのイディオムです.C++のベストプラクティスは、可能な限り狭い範囲で、必要に応じて常に初期化し、可能な限りconstを作成することです。 – spraff

1
lIt++; 
lIt++; 

あなたは」初期化していませんlItイテレータ、まだそれを増やしています。それが問題だ。

インクリメントし、それを初期化します。

lIt = iList.begin(); 
lIt++; 
lIt++; 
1

をコメントはいつもうそ!

//0 <-- current pos of iterator lIt 

いいえ、そうではありません。 lItはこの時点では初期化されていません。

+0

*は初期化されていません。はい。 – Johnsyweb

+0

ええ?私は怒っているよ、私はそれが "初期化されている"と言ったオリジナルを読むと確信している.. :)私を無視.. – Nim