如何编写以通用方式获取迭代器或集合的函数?

Jes*_*per 2 c++ java collections

在过去8年左右的时间里,我几乎一直是Java程序员,最近我又一直在玩C++.对于C++ STL和Java中的迭代器,我遇到了一个问题.

在Java中,您可以编写一个采用如下迭代器的方法:

void someMethod(Iterator<String> data) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

你传入一个Iterator并且该方法不需要知道该迭代器的底层集合是什么,这很好.

在C++中,迭代器没有通用的基类(据我所知).我必须写一个这样的函数:

void some_function(std::vector<std::string>::const_iterator data) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

换句话说,some_function知道迭代器是一个迭代器vector.这不好,因为无论迭代器的底层集合是什么,我都希望函数能够工作.

我怎么能用C++做到这一点?如果它真的不可能,那么在C++中创建一个以集合作为参数的函数的最佳方法是什么,但是不需要知道具体的集合类型是什么?

附录

谢谢你的回答.除了答案之外,我在"C++标准库:教程和参考"(Nicolai M. Josuttis)一书第7.5段(迭代器特征)中找到了一些很好的信息.第7.5.1段解释了如何为不同的迭代器类别编写函数的专用版本.

CB *_*ley 6

您可能想要考虑一个功能模板.看看一些std <algorithm>功能模板是如何工作的std::for_each.

例如

template< class Iterator >
void some_function( Iterator first, Iterator last )
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用多种可迭代范围调用从此模板生成的函数.

例如

std::vector< double > my_doubles;
// ... populate doubles
some_function( my_doubles.begin(), my_doubles.end() );


std::set< Custom > my_custom_class_set;
// ... populate ...
some_function( my_custom_class_set.begin(), my_custom_class_set.end() );

int raw_array[50];
// ... populate ...
some_function( raw_array, raw_array + 50 );
Run Code Online (Sandbox Code Playgroud)

  • 关键是,在 C++ 中,模板在编译时实例化,因此迭代器不需要公共基类,只要它们都具有相同的“形状”即可。 (2认同)