编写std::for_each不是为了获取std::list,这是有原因的吗
Is there a reason std::for_each was not written to take a std::list?
我意识到这相当于语法糖,但随着lambda的出现,我希望能够键入
std::for_each(list, [](Emitter& e) { e->emit() });
而不是
std::for_each(list.begin(), list.end(), ....);
我知道后者更通用,但它们可以同时提供(AFAICT前者只是另一个模板函数)
你猜怎么着?你可以!;-)通过定义自己的for_each
函数:
template <class C, class F>
F for_each(C const& c, F f) {
return std::for_each(std::begin(c), std::end(c), f);
}
你可以在这里看到一个活生生的例子:http://ideone.com/gwGNGL
随着lambdas的出现,也出现了基于范围的for
循环:
for (auto &e: list)
e.emit();
标准算法适用于范围,而不是容器。这是一个深思熟虑的设计决定。标准库不应过于庞大。如果你想自己添加这个功能,你可以简单地添加。
由于我不在Comitie上,下面是猜测。但对我来说似乎是合法的。
std::for_each不是为了获取std::list而编写的吗?
代码膨胀
同时提供for_each (begin, end)
和for_each (container)
实际上是多余的。毕竟,正如您所说,您可以简单地编写for_each (c.begin(), c.end())
并获得您想要的行为。
由于您提出的版本只是语法糖,而且比库中的版本(采用begin
和end
迭代器)更具限制性,因此添加它毫无意义
我想你可以把这看作是"不要为你不想要的东西买单"哲学的延伸,这一哲学指导了C++的大部分总体设计。如前所述,您可以非常简单地提供自己的相当通用的函数。以下是一些psudocde示例:
namespace blah
{
template <typename Cont, typename UnaryFunction> inline UnaryFunction for_each (Cont& cont, UnaryFunction f)
{
return std::for_each (cont.begin(), cont.end(), f);
}
}
相关文章:
- 使用std::multimap迭代器创建std::list
- 使用"std::unordereded_map"映射到"std::list"对象
- 使用std::list创建循环链表
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 包含 std::list 的结构体的 C++ 初始化
- 在基于范围的 for 循环期间插入 std::list 的后面
- 循环挂起迭代的 std::擦除 on std::list
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- std::list 中的迭代器感知对象
- std::list 可以用于简单的无锁队列吗?
- 使用 std::list 存储顶点并使用 SFML 绘制它们
- C++11 基于范围的 for 循环,用于 std::list
- 向 std::list 添加新元素的复杂性
- 如何使用 std::list 模板的迭代器擦除
- 将元素添加到 std::list 在多线程中,无需 C++ 互斥锁
- 如何将文件的一部分读取到std::list缓冲区?
- 抽象和派生与std::list相结合
- std::list 的两个 insert() 方法签名之间的实现差异
- C++:我可以重用/移动 std::list 元素从中间到结尾吗?