2017-03-05 15 views
-2

C++ std :: setを繰り返し処理しようとしていますが、メンバ関数にアクセスしようとしています。しかし、私の次のコードは動作していません。C++でイテレータを使ってメンバ関数にアクセスする方法std :: set

#include <iostream> 
#include <set> 
using namespace std; 
class A; 

std::set<A> m_vector; 
std::set<A>::iterator iter = m_vector.begin(); 

class A 
{ 
    public: 
    int age; 
    A() 
    { 
     cout << "enter age" << endl; 
     cin >> age; 
    } 

    int getAge() 
    { 
     return age; 
    } 
    private: 

}; 
void addNewVoter() 
{ 
    m_vector.insert(A()); 
} 
int main() 
{ 
    addNewVoter(); 
    addNewVoter(); 
    addNewVoter(); 
    for (size_t i = 0; i < m_vector.size(); i++) 
    { 
     cout << (*iter)->getAge(); /* Here is the mistake. I can't invoke this.*/ 
     iter++; 
    } 
} 

私の質問は、どのようにイテレータでメンバー関数を呼び出すことができますか?最初

+0

'iter-> getAge() 'または'(* ITER).getAge()' insert'または 'push_back'イテレータを無効とベクトルの変更' – max66

+1

。 – nwp

答えて

1

トラバースの準備ができたら、iterを初期化します。また、アクセス会員はiter->getAge()または(*iter).getAge()のいずれかでアクセスしてください。

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

class A; 

std::set<A> m_vector; 
std::set<A>::iterator iter; 

/* other codes */ 

int main() 
{ 
    addNewVoter(); 
    addNewVoter(); 
    addNewVoter(); 

    iter = m_vector.begin(); 

    while(iter != m_vector.end()) 
    { 
     cout << iter->getAge(); 
     iter++; 
    } 
} 
+0

ありがとう:) :) :) –

1

編集:

は、あなたが、少なくともポインタを通じてそのメンバ関数を呼び出す方法を知っているとしましょう。コメントはiter->getAge()または(*iter).getAge()です。

std::set<A> my_set; 
auto it = my_set.begin(); 
// some inserts 
std::cout << it->getAge() << std::endl; 

未定義の動作となる。


は、その後、あなたはこれをやっています。参照しないでくださいbeginイテレータは元々空のコンテナから取得しました。

ただ、代わりに、これを使用する:

for (auto it = my_set.begin(); it != my_set.end(); ++it) 
    std::cout << it->getAge() << std::endl; 

または範囲ベースforを...


あなたが見ることができるように、彼らはだから、私はあなたの命名規則を使用することを拒否悪いと誤解を招く。

+0

応答ありがとうございますが、これはうまくいきません...私は最初の3つのオブジェクトをセットに追加したいので、その後getAge()関数を使用したい イテレータ –

1

コードスニペットには3つの変更が必要です。 std ::は内部的に赤い黒のバイナリツリーを実装しており、比較のために演算子のオーバーロードが必要でした。あなたがAのconstオブジェクトを渡す()関数系、getAgeを呼び出している間ので、あなたのgetAge関数はconstの関数であるべきその後

bool operator <(const A& other) const 
{ 
     return age < other.age; 
} 

だからクラスには、追加の機能を持っている必要があります。

int getAge() const 
      ^^^^^ 
{ 
    return age; 
} 

第3に、これらの構文のいずれかを使用してgetAge関数を呼び出す必要があります。 (*iter).getAge()またはiter->getAge();それを混ぜてはいけません。

Demo

関連する問題