2016-12-26 2 views
0

C++イテレータをキューに入れても問題ありませんか?たとえば:あなたは変数vecsを変更した場合キューにC++イテレータを入れてください

vector<vector<int>> vecs; 
queue<pair<vector<int>::iterator, vector<int>::iterator>> mq; 
for (auto &e : vecs) 
{ 
    mq.push(make_pair(e.begin(), e.end())); 
} 
+2

後でベクターを使って何をするかに非常に注意してください。 'std :: vector'はハットの一滴でイテレータを無効にする傾向があります。 –

答えて

0
#include<iostream> 
#include<vector> 
#include<queue> 
#include<algorithm> 
#include<utility> 

using namespace std; 
vector<vector<int>> vecs; 
queue<pair<vector<int>::iterator, vector<int>::iterator>> mq; 

void populate_vector() 
{ 
    for(int i = 0;i<6;++i) 
    { 
     for(int j =0;j<6;++j) 
     { 
      vecs[i].push_back(i+j); 
     } 
    } 
} 
void print_queue() 
{ 
    queue<pair<vector<int>::iterator, vector<int>::iterator>> :: iterator qiter = begin(mq);qiter != end(mq);++qiter) 
     cout<<"*qiter.first"<<*qiter.first<<"*qiter.second"<<*qiter.second<<endl; 
} 
void print_vector_run_time_error(vector<vector<int>> cont){ 

    try{  
     for(int i =0;i<6;++i) 
     { 
      for(int j =0;j<6;++j) 
      { 
       cout<<cont[i][j]<<" "; 
      } 
      cout<<endl; 
     } 
     } 
    catch(exception &e){ 

     cout<<e.what(); 
    } 

} 

int main() 
{ 

    for (auto &e : vecs) 
    { 
     mq.push(make_pair(e.begin(), e.end())); 
    } 
    /* 
     if the below 3 function calls were not present,compilation and running happens successfully . 
     This code creates problems at compile or run time as described below (whenever memory is accessed and iterators are invalidated). 
    */ 

    print_queue(); 
    /* 
     gives a compile time error as the compiler does not recognize a call to vector<int>::iterator as iterator is not a container 
    */ 

    populate_vector(); 
    /* 
    the above function compiles successfully but terminates at run time , because memory is accessed during run time to fill the 
    elements with a value(C++11 vector is populated always at run time). 
    */ 

    print_vector_run_time_error(vecs); 

    /* above function call to print vector compiles successfully , but terminates at run time 
    because memory is accessed at run time to print the value of the elements. 
    */ 


    return 0; 
} 

このコードは、この問題を説明します。

+0

この回答には明確な要約が役立ちます。また、コードにはタイプミスがあります。[オンラインコンパイラ](http://coliru.stacked-crooked.com)の助けを借りてクリーンアップすることをお勧めします。最後に、[using namespace std; ']の使用を推奨しないでください(http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) – Quentin

関連する問題