c++ - 连续迭代多个列表(C++)

标签 c++ iterator

我有 3 个类,其中 2 个像这样从另一个继承:

class A {
  public:
    virtual void foo() {cout << "I am A!" << endl;}
};

class B : public A {
  public:
    void foo() {cout << "B pretending to be A." << endl}
    void onlyBFoo() {cout << "I am B!" << endl}
};

class C : public A {
  public:
    void foo() {cout << "C pretending to be A." << endl}
    void onlyCFoo() {cout << "I am C!" << endl}
};

我想做的是这样的:

list<A*> list_of_A;
list<B*> list_of_B;
list<C*> list_of_C;

//put three of each class in their respective list

cout << "First loop:" << endl;
for (list<B>::iterator it = list_of_B.begin(); it != list_of_B.end(); ++it) {
  (*it)->onlyBFoo();
}

cout << "Second loop:" << endl;
for (list<C>::iterator it = list_of_C.begin(); it != list_of_C.end(); ++it) {
  (*it)->onlyCFoo();
}

//This part I am not sure about
cout << "Third loop:" << endl;
for (Iterate all 3 loops i.e. *it points to As, then Bs then Cs) {
  (*it)->foo();
}

输出:

First loop:
I am B!
I am B!
I am B!

Second loop:
I am C!
I am C!
I am C!

Third loop:
I am A!
I am A!
I am A!
B pretending to be A.
B pretending to be A.
B pretending to be A.
C pretending to be A.
C pretending to be A.
C pretending to be A.

即有时我只想迭代 B 对象,但有时我想迭代所有对象。

一个解决方案是将它们全部存储在一个列表中,但是我希望能够按类型顺序遍历它们,即 As 然后 Bs 然后 Cs。

另一个建议的解决方案是使用迭代器或 iterator_adapters,但是我以前从未使用过它们,也找不到一个简单的例子来帮助我开始使用它们。

最佳答案

提升 iterator adapters可能会给你你需要的东西——你可以创建一个多态列表(所有项目),然后创建迭代器适配器,只迭代 B 项目,或只迭代 C 项目。您可以使用标准迭代器列出所有项目。

正如其他人所提到的,您需要多态列表来包含指针,这样您的项目就不会被分割。然后您需要管理项目的生命周期,即确保在删除容器时删除它们。有智能指针类可以使该任务更容易。

关于c++ - 连续迭代多个列表(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2890013/

相关文章:

c++ - QProcess(网络使用)不起作用

C++:无论如何都知道是什么触发了 If 语句?

java - 获取 Java 的列表迭代器以返回 Object 以外的内容

c++ - 是否有一种通用方法来迭代一组对象中的特定变量?

c++ - C 代码中的 C4201 警告

C++:打印/分配简单数组打印乱码

c++ - 通过不同的容器修改std容器的内容

java - 对 ArrayList 进行操作时,AbstractList.remove() 中出现 UnsupportedOperationException

c++ - 使用指向文件的指针从 vector 中保存对象

c++ - 如何在回溯中显示 lambda 函数?