C++ 中是否有与 Java 的 Collection 接口类似的东西?

Alg*_*ous -1 c++ java inheritance interface

我正在尝试用 C++ 创建一个双向链表,并且我正在尝试正确执行它。因此,我认为我应该遵守任何“官方”C++ 指南推荐的任何接口结构,例如接口。在Java中,有这样的接口,可以免费使用,并且标准化抽象数据类型(例如https://docs.oracle.com/javase/8/docs/api/java/util/List.html) 。

我的问题:C++中有类似的东西吗?Startpageing 找到了我这个链接:

https://en.cppreference.com/w/cpp/container/list

但它似乎没有使用任何继承。

小智 5

标准库的设计方式首先是为了避免需要此类继承。

通常,通过在容器类型上进行鸭子类型输入,您可以获得与接口基本相同的行为,而无需任何间接调用的运行时开销:

#include <vector>
#include <list>
#include <iostream>

template<typename Collection>
void do_something(const Collection& data) {
  for(const auto& v : data) {
     std::cout << v << "\n";
  }
}

int main() {
  std::vector<int> a;
  std::list<int> b;

  do_something(a);
  do_something(b);
}
Run Code Online (Sandbox Code Playgroud)

如果您从 Java 的角度来处理这个问题,您可以将其视为“类固醇泛型”,其中函数通常可以接受任何看起来像集合的东西。

还有一些其他可能涉及迭代器和范围的方法,但原理保持不变。

  • 因为这个概念在评论和答案中出现过几次,[关于 Duck Typing 的维基百科页面](https://en.wikipedia.org/wiki/Duck_typing)。 (2认同)