【问题标题】:How to access member function with iterator in C++ std::set如何在 C++ std::set 中使用迭代器访问成员函数
【发布时间】:2017-03-05 10:51:11
【问题描述】:

我正在尝试遍历 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++;
    }
}

我的问题是,如何使用迭代器调用成员函数?

【问题讨论】:

  • iter-&gt;getAge()(*iter).getAge()
  • insertpush_back 改变向量会使迭代器失效。
  • std::set&lt;A&gt; m_vector; 它是全球性的,哇。

标签: c++ c++11 iterator


【解决方案1】:

当你准备好遍历时初始化iter。此外,通过iter-&gt;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++;
    }
}

【讨论】:

  • 非常感谢 :) :) :)
【解决方案2】:

先编辑:

假设您至少知道如何通过指针调用该成员函数。答案是 iter-&gt;getAge()(*iter).getAge() - 在 cmets 中。


那么你正在这样做:

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...


如您所见,我拒绝使用您的命名约定,因为它们不好且具有误导性。

【讨论】:

  • 感谢您的回复,但这不起作用...我想在集合中添加前 3 个对象,然后我想通过迭代器获取函数 getAge()
【解决方案3】:

您的代码 sn-p 需要进行三处更改。 std::set 在内部实现了一个红黑二叉树,它需要一个运算符重载来进行比较。

所以你的班级应该有一个额外的功能:

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

那么当你调用 getAge() 函数时系统传递了一个 A 的 const 对象,所以你的 getAge 函数应该是一个 const 函数。

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

第三,您应该使用其中一种语法调用 getAge 函数。 (*iter).getAge()iter-&gt;getAge();不要混淆。

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-22
    • 2012-05-26
    • 2017-01-07
    • 1970-01-01
    • 2012-10-03
    • 2015-06-11
    • 2019-02-27
    相关资源
    最近更新 更多