0

プライベート変数としてマップ変数を持つクラスが必要です:

class CTest{
private:
 std::map<int, int> m_map;
public:
 std::map<int int>::iterator get_iterator();
 void add(int key, int val) { m_map[key] = val; }
}

たとえば、関数でマップに対して反復処理some_action()のみを使用できる方法はありますか:get_iterator()

CTest c;

/* here i want to go through that m_map, but i cannot have access to it */
void some_actoin(){
 ???
}

int main(void){
  c.add(1, 1);
  c.add(2, 3);
  some_action();
}

よろしく、J.

4

3 に答える 3

6

本当にこれを行いたい場合は、パブリック メソッドを追加して開始イテレータと終了イテレータを取得できます。

class CTest{
private:
    std::map<int, int> m_map;
public:
    std::map<int, int>::const_iterator cbegin() { return m_map.cbegin(); }
    std::map<int, int>::const_iterator cend() { return m_map.cend(); }
};

CTest c;

void some_action()
{
    for (std::map<int, int>::const_iterator it = c.cbegin(); it != c.cend(); ++it)
    {
        // do action
    }
}
于 2013-07-26T07:11:38.543 に答える
1

短い答えはノーです。ループを終了するには、少なくとも m_map.end() が必要です。ただし、クラスに を受け入れるget_iterator()ようなものを追加する代わりに、 を使用してマップ内のすべての要素に適用することをお勧めします。このように、アクションはマップを反復することを知る必要さえありません。それはただ仕事をします。for_eachstd::functionstd::for_each

于 2013-07-26T07:14:50.733 に答える
1

それを繰り返すには、「始まり」と「終わり」が必要です。

例えば

class CTest{
private:
 std::map<int, int> m_map;
public:
 std::map<int int>::const_iterator cbegin();
 std::map<int int>::const_iterator cend();
 void add(int key, int val) { m_map[key] = val; }
}

void some_actoin()
{
 for(std::map<int int>::const_iterator it = c.cbegin(); it != c.cend(); ++it)
 {
     const auto& val = *it;
 }

 // C++11
 for(const auto& val : c)
 {
 }
}
于 2013-07-26T07:11:26.967 に答える