微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++中的Java迭代器

如何解决C++中的Java迭代器

我是一名 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 等价抽象可以允许在运行时以多态方式使用标准容器。您只需返回正在创建的实际类型。

类型推导(请参阅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++ 是一种强类型语言,由于它使用值语义并允许用户严格控制资源所有权,因此很难在运行时抽象出类型信息,除非相关类型已经设计为以这种方式使用。并且标准容器并不是为了运行时多态而设计的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。