独立的STL算法(如std::count_if
)采用一对迭代器。在我使用这些的所有情况下(以及我在网上看过的所有例子中),我发现自己打字
std::count_if(myContainer.begin(),myContainer.end(), /* ... */ );
有没有理由为什么样式的简写模板
std::count_if(myContainer, /* ... */ );
鉴于在整个容器上进行的操作不是很多,没有提供?我只是忽略了它吗?对于c ++ 11和c ++ 03,答案是否有所不同?
答案 0 :(得分:10)
Herb Sutter讨论这个问题时有一个很好的blog-post。要点是,如果已经存在具有相同数量的模板参数的该算法的重载,则为算法添加基于容器的重载可能会产生歧义。概念旨在解决这个问题。
答案 1 :(得分:2)
可能为迭代器范围提供灵活性的一个原因。您可能不需要在某个时间迭代所有元素:
<iterator> it = myContainer.begin();
it++; // do something
it++; // do something
...
std::count_if(it, myContainer.end(), /* ... */ );
此外,您始终可以使用包装器为您执行此操作:
template<typename T>
... count_if (T myContainer, ...)
{
std::count_if(myContainer.begin(), myContainer.end(), /* ... */ );
}
答案 2 :(得分:2)
STL原则和灵活性主要是因为对迭代器而不是容器进行操作。这不是一个大问题,你可以重复使用我早期C年使用的技巧:
#define FULL_RANGE(c) (c).begin(), (c).end()
std::copy(FULL_RANGE(c), std::ostream_iterator<c::value_type>(cout, "\n"));
答案 3 :(得分:0)
只是因为STL算法使用迭代器连接/与容器对话。