如何解决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 举报,一经查实,本站将立刻删除。