Java C++ 中的迭代器

Java Iterator in C++

我是一个 Java 用户,我正在学习 C++,在 Java 中它允许 类 显示 Iterable 类型,以便客户端可以遍历某些实例的数据集合。有没有办法在 C++ 中获得此功能?这是我试图在 C++ 中实现的示例。

 public Iterable<String> keys() {
    Queue<String> queue = new Queue<String>();
    collect(root, new StringBuilder(), queue);
    return queue;

C++ 不像 Java 那样面向对象。虽然容器在它们的接口中确实有一些统一性,但它们不实现公共接口类型或从公共基础派生。这些类型的隐式接口只允许编译时多态性,所以你没有任何 Iterable 抽象等价物可以允许标准容器在运行时多态性使用。您只需 return 正在创建的实际类型。

类型推导(参见 auto)将解决您可能期望从此类解决方案中获得的大多数问题。它允许编译器决定用于存储值的适当类型,允许您可能正在寻找这个问题的那种概括。

这是一个可能的实现 (try it here) :

#include <algorithm>
#include <iostream>
#include <map>
#include <string>
#include <vector>

template<class T>
auto map_keys(const T & container)
{
    auto result = std::vector<typename T::key_type>{};
    std::transform(
        std::begin(container), std::end(container),
        std::back_inserter(result),
        [](const auto & pair) { return pair.first;});
    return result;
}

int main()
{
    auto my_map = std::map<std::string, int>{
        {"foo", 10},
        {"bar", 20},
        {"baz", 30} };
    
    auto keys = map_keys(my_map);

    for(const auto & key : keys)
    {
        std::cout << key << '\n';
    }
}

希望它有助于说明在 C++ 中泛化通常是使用编译时多态性实现的,而不是 Java 专门使用(据我所知)运行时多态性。

如果您确实需要运行时多态性,例如,如果您正在尝试构建一个可迭代范围的同质容器,可能有解决方案,但它们不方便,而且肯定不符合习惯。 C++ 是一种强类型语言,由于它使用值语义并允许用户严格控制资源所有权,因此很难在运行时抽象出类型信息,除非相关类型已经被设计为以这种方式使用。并且标准容器未设计为运行时多态。