首页 > 解决方案 > 如何在 C++ 中以最佳方式循环遍历类成员向量的元素?

问题描述

我有class一个成员的 A vector<class B>。我想以一种干净的方式vector从 A 外部循环遍历它。class我需要使用 B 的公共功能对其进行操作。

为此,我想到了一个函数int get_next_element(B * in_B),如果我正确加载了下一个元素,我可以返回 0,否则返回 -1。

我想通过使用来做到这一点iterator,但我发现了两个问题。首先,我找不到将 an 转换为 a 的简洁方法iteratorpointer似乎我可以iterator像 a 一样使用 an pointer,但我不确定这是一个好的解决方案)。其次,我需要检查 my 是否引用了一个值iterator,并且由于最接近“空迭代器”的.end()元素是我不知道如何初始化它的元素。如果我初始化它(空)并有引用.end(),如果我向它添加一些东西,它就不会引用任何可比较的东西。

我可以有一个额外的东西int来跟踪我所在的元素,但是int每当我添加元素等时,我都必须管理它。

我考虑将迭代代码放在classA 之外,但我可能需要在循环期间更改或访问单个元素,这样会形成一个复杂/大的迭代块。

我将如何以干净的方式(例如int get_next_element(B * in_b))解决这个问题?

编辑:这是一些代码:标题:

class B {
  public:
    B();
    void set_size(int in_size);
    int get_size();
  protected:
    int mSize;
};

class A {
  public:
    A();
    void add_B(B in_B);
    int get_next_element(B * in_B);
  protected:
    std::vector<B> mObjects;
};

cpp文件:

B::B() {
  // Stuff
}
void B::set_size(int in_size) {
  mSize = in_size;
}
int B::get_size() {
  return mSize;
}

A::A() {
  // Stuff
}
void A::add_B(B in_B) {
  mObjects.push_back(in_B);
}
int A::get_next_element(B * in_B) {
  // ToDo : handle elements
}

主要:

int main() {
  A test_a;
  for (int i = 0; i < 5; i++) {
    B tmp_b;
    tmp_b.set_size(i);
    test_a.add_B(tmp_b);
  }
  B iterator_b;
  while (0 == get_next_element(& iterator_b)) {
    if (iterator_b.get_size > 2) {
      B tmp_b;
      tmp_b.set_size(iterator_b.get_size - 2);
      test_a.add_B(tmp_b);
      iterator_b.set_size(2);
    }
  }
}

因此,基本上A包含一堆Bs 并且可以帮助 main 遍历它们并(在此示例中)将它们切割成更小的部分,而main. 有很多维度/方式可以做到这一点,这也是我想“隐藏”尽可能多的代码的部分原因A

(这有点简化,就像B可能必须有内部关系,但基本上就是这样)

标签: c++classvectorelement

解决方案


考虑使用基于范围的 for 循环( C++1x)。

class A {
  private:
    std::vector<class B> vec;
  public:
    std::vector<class B>& get_vec() { return vec; }
};

A a_instance;
for (B &b : a_instance.get_vec()) {
    b.print();
    std::cout <<  "b = " <<  b << std::endl;
    std::cout << "&b = " << &b << std::endl;
}

不幸的是,这不允许向前看,除非您自己跟踪索引。


推荐阅读