C ++ STL使用一组指针访问类的成员

时间:2011-11-13 19:37:52

标签: c++ stl set

我有一组指向以下类对象的指针:

class name_id {
    public:
        name_id(string name_a, int id_a) { name = name_a; id = id_a; }
        string name;
        int id;
        bool operator<(name_id &);
};

稍后,在填充集合之后,我将此集传递给函数并尝试访问每个对象的名称字段:

void print_by_rank(set<name_id *> &nameIdSet, map<int, int> &votesMap)
{
    vector<string> names;
    vector<string>::iterator names_it;

    set<name_id *>::iterator nameIdSet_it;
    for(nameIdSet_it = nameIdSet.begin(); nameIdSet_it != nameIdSet.end(); ++nameIdSet_it)
        //names.push_back(nameIdSet_it->name);
        cout << nameIdSet_it->name << endl;
}

但是,底部的两行都不会编译。我收到以下消息:

g++ -o bobwinner bobwinner.cpp
bobwinner.cpp: In function 'void print_by_rank(std::set<name_id*, std::less<name_id*>, std::allocator<name_id*> >&, std::map<int, int, std::less<int>, std::allocator<std::pair<const int, int> > >&)':
bobwinner.cpp:68: error: request for member 'name' in '* nameIdSet_it.std::_Rb_tree_const_iterator<_Tp>::operator-> [with _Tp = name_id*]()', which is of non-class type 'name_id* const'

我不明白为什么我不能在迭代器上使用箭头操作符来访问set元素指向的对象的name字段。

3 个答案:

答案 0 :(得分:5)

您需要取消引用迭代器才能获取指针。然后,您需要取消引用指针以获取对象本身。所以你可能想要:

cout << (*nameIdSet_it)->name << endl;

答案 1 :(得分:0)

你需要取消引用迭代器,它本身会给你一个指针,你需要再次取消引用:

(*nameIdSet_it)->name
^^^^^^^^^^^^^^^
  this is a pointer

答案 2 :(得分:0)

除了编译之外,你还会感到惊讶,因为指针集不会被底层对象的比较器排序,所以这可能不会像你想象的那样做。