STL 算法将整个容器而不是 .begin()、end() 作为参数? [重复]

问题描述 投票:0回答:4

独立的 STL 算法(如

std::count_if
)采用一对迭代器。在我使用这些的所有情况下(以及我在网上看到的所有示例!),我发现自己在打字

std::count_if(myContainer.begin(),myContainer.end(), /* ... */ );

样式的速记模板有没有原因

std::count_if(myContainer, /* ... */ );

没有提供,因为操作多半是在整个容器上执行的?难道我刚才忽略了它? c++11 和 c++03 的答案不同吗?

c++ stl iterator containers c++11
4个回答
10
投票

Herb Sutter 有一篇不错的博客文章讨论了这个问题。要点是,如果已经存在具有相同数量模板参数的算法的重载,则为算法添加基于容器的重载可能会产生歧义。概念旨在解决这个问题。


2
投票

STL的原理和灵活性主要是因为操作在迭代器而不是容器上。这不是一个大问题,你可以重复使用我在早期 C 语言中使用的技巧:

#define FULL_RANGE(c) (c).begin(), (c).end()

std::copy(FULL_RANGE(c), std::ostream_iterator<c::value_type>(cout, "\n")); 

1
投票

一个原因可能是提供迭代范围的灵活性。有时您可能不想迭代所有元素:

<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(), /* ... */ );
}

-1
投票

仅仅因为STL算法是使用迭代器与容器连接/对话的。

© www.soinside.com 2019 - 2024. All rights reserved.