2017-08-14 3 views
0

リストのイテレータを次のように使用しようとしていますが、これは正しい方法ですか?リスト内のベクトルのイテレータを使用する

私は2つのベクトルv1とv2を持ち、it1とit2の2つのイテレータを使用しています。後でiterator it1とit2をpush_backするためにlist<vector<int>::iterator>というリストを使用しています。これはうまくいきますが、ベクトルのいずれかが空であれば、それはクラッシュします。

int main() { 
vector<int> v1 ={1,2,3}; 
vector<int> v2 ={4,5,6,7}; 

vector<int>::iterator it1 = v1.begin(); 
vector<int>::iterator it2 = v2.begin(); 


list<vector<int>::iterator> l; 
l.push_back(it1); 
l.push_back(it2); 

for(auto a : l){ 
    vector<int>::iterator it = a; 
    while(*it){ 
     cout<<*it<<endl; 
     it++; 
    } 
} 
    return 0; 
} 
+4

これはかなり狂っています。なぜイテレータのベクトルで、ベクターが変異していると無効になりますか?また、エンドイテレータをキャプチャしていません。それは、あなたがベクトルの終わりにいることを知っておくべき方法であり、 'それ 'ではありません。リストが空の場合、 'begin == end'となるので、反復がなく、' it'を逆参照する必要はありません。 –

答えて

0

逆参照が有効であることがわかるまで、反復子を逆参照できないため、失敗します。ベクトルが空の場合begin == endとendは、逆参照するのに有効なものではありません。

endを知らずにコンテナを繰り返し処理することはできず、キャプチャしない場合は、beginしかキャプチャしません。妥当性をテストするためにイテレータを逆参照するだけでは正しくありません。任意の価値を保持することができます。

ベクトルごとにイテレータのペアをキャプチャする代替手段はありますか?

#include <vector> 
#include <list> 

#include <iostream> 
#include <utility> 
using namespace std; 

int main() 
{ 
    const vector<int> v1 ={1,2,3}; 
    const vector<int> v2 ={4,5,6,7}; 

    list<pair<vector<int>::const_iterator, 
       vector<int>::const_iterator>> L; 

    L.push_back(make_pair(begin(v1), end(v1))); 
    L.push_back(make_pair(begin(v2), end(v2))); 

    for(const auto& a : L){ 

     for(auto it = a.first; it != a.second; ++it) 
     { 
      cout << *it << '\n'; 
     } 
    } 
} 

これで、エンドイテレータを知っているように停止することができました。

2

クラッシュがラインwhile(*it){に間接参照itにしようとしてから来ています。ベクトルvが空の場合、イテレータv.begin()は有効なメモリを指しません。逆参照すると、セグメンテーションフォルトが発生します。 v1仮定するが空の場合

+0

これは、イテレータまたは一般的なポインタを使って何かを行う前に常にチェックすることを目的としています。あなたのwhileループの前に単にif(* it){while(* it)cout << * it << endl;を追加するだけです。それは++です。 } else {return; } –

+2

@OmidCompSCI助けに行くとは思っていません.if(* it) 'も参照解除され、失敗します。 –

+0

@OmidCompSCIそれが動作するとは思わない、セグメンテーションフォールトは引き続き発生します。 – identicon

0
list<vector<int>::iterator> l; 
l.push_back(it1); 

、そしてit1はベクトルの最後の要素過去の一つであり、あなたがしようとしている

while(*it){ 

を行う際に、後vector.Soの一部ではありませんv1::end()だろうこれを避けるには、イテレータがendを指さない場合にのみ、lに挿入する必要があります。

if(it1!= v1.end()) 
    l.push_back(it1);