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

您需要一个“开始”和一个“结束”来迭代它。

例如

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 回答
1

最简洁的答案是不。您至少需要 m_map.end() 来结束循环。但是,我建议不要在您的类中get_iterator()添加一些for_each可以接受的std::function内容,并将其应用于地图中的所有元素,使用std::for_each. 这样,您的动作甚至不需要知道它迭代地图,它只是完成它的工作。

于 2013-07-26T07:14:50.733 回答