我想传递任意容器作为函数的参数并迭代它(没有擦除也没有推送元素)。不幸的是,似乎没有标准的方法来做到这一点。
我想到的第一个解决方案是一个接口(让我们称之为CollectionInterface
)由将包装STL容器的类实现。所以函数声明看起来像:
f(const CollectionInterface * collection);
或者,我正在考虑方法模板,它具有在编译时保持绑定的优点:
template <class CONTAINER> void f(const CONTAINER & collection);
您认为哪种方式更好?
答案 0 :(得分:7)
ForwardIterator?这是一种InputIterator(或OutputIterator),它也允许多次传递算法(递增它不会使先前值无效)。
迭代器(与Java迭代器完全不同)是统一C ++集合的核心线程。有关处理它们的算法(以及相关的迭代器类型要求)的示例,您可以从<algorithm>
开始。特别是,search提供了使用ForwardIterator的示例。它在范围[first1, last1]
定义的序列的[first2, last2)
范围内找到第一个匹配项。这些都是符合ForwardIterator
。
答案 1 :(得分:4)
如果这是您想要处理的方式,您也可以编写接受整个容器而不是引用的方法。标准库容器中的迭代器都是通过成员函数begin()
和end()
提供的,或者在某些情况下rbegin()
和rend()
提供,以便向后迭代。模板的工作方式,您不必创建对象派生的实际接口类型;而是使用对象推断出需求。
template<typename Container> void Function(const Container& c) {
for(typename Container::const_iterator i = c.begin(), end = c.end(); i != end; ++i)
//do something
}
传递迭代器在使用函数时提供了更大的灵活性,特别是因为并非所有迭代器都来自具有显式begin()
和end()
函数的容器,并且您可以提供所需的任何显式子范围。但有时这种方法是合适的。
答案 2 :(得分:4)
我想传递任意容器作为函数的参数并迭代它(没有擦除也没有推送元素)。
传递迭代器。以下是实施和使用的示例:
template <typename Iter>
void function(Iter begin, Iter end)
{
for (Iter it = begin; it != end; ++it)
{
std::cout << *it << std::endl;
}
}
int main()
{
std::string array[] = {"hello", "array", "world"};
function(array, array + 3);
std::vector<std::string> vec = {"hello", "vector", "world"};
function(vec.begin(), vec.end());
}
请注意,在许多情况下,您实际上并不需要编写该函数,但您可以使用库工具来编写它,然后只需对其应用std::for_each
。或者甚至更好,使用预先存在的算法,如std::accumulate
或std::find_if
。