独立的 STL 算法(如
std::count_if
)采用一对迭代器。在我使用这些的所有情况下(以及我在网上看到的所有示例!),我发现自己在打字
std::count_if(myContainer.begin(),myContainer.end(), /* ... */ );
样式的速记模板有没有原因
std::count_if(myContainer, /* ... */ );
没有提供,因为操作多半是在整个容器上执行的?难道我刚才忽略了它? c++11 和 c++03 的答案不同吗?
Herb Sutter 有一篇不错的博客文章讨论了这个问题。要点是,如果已经存在具有相同数量模板参数的算法的重载,则为算法添加基于容器的重载可能会产生歧义。概念旨在解决这个问题。
STL的原理和灵活性主要是因为操作在迭代器而不是容器上。这不是一个大问题,你可以重复使用我在早期 C 语言中使用的技巧:
#define FULL_RANGE(c) (c).begin(), (c).end()
std::copy(FULL_RANGE(c), std::ostream_iterator<c::value_type>(cout, "\n"));
一个原因可能是提供迭代范围的灵活性。有时您可能不想迭代所有元素:
<iterator> it = myContainer.begin();
it++; // do something
it++; // do something
...
std::count_if(it, myContainer.end(), /* ... */);
或 std::count_if(myContainer.begin(), myContainer.end() - N, /* ... */);
顺便说一句,你总是可以有一个包装器来为你做到这一点:
template<typename T>
... count_if (T& myContainer, ...)
{
std::count_if(myContainer.begin(), myContainer.end(), /* ... */ );
}
仅仅因为STL算法是使用迭代器与容器连接/对话的。