迭代顺序集合的习惯用法
Idioms for iterating a sequential collection
在现代c++中,当您只需要每个元素的值时,迭代顺序集合(如string或vector)的习惯用法是简短而优雅的:
for (auto x: xs)
当您还需要索引时,它就不那么优雅了:
for (size_t i = 0; i != xs.size() ++i)
…除非最近有什么进展我还没跟上c++ 11是否有一种更好的方法来实现后者,或者上述方法仍然是最好的吗?
Range-Based for loops
将在现代代码Range-Based for Loops
中非常流行对支持范围概念的任何类型都有效。给定T型对象obj, begin(obj)
和end(obj)
是有效的。包括:
- 所有c++ 11库容器。
- 数组和值数组。
- 初始化器列表。
- 正则表达式匹配。
- 任何UDT(用户定义类型)T,其中begin(T)和end(T)产生合适的迭代器。
首选和惯用的方法是简单的for循环。
其他方法包括使用整数范围:
template<typename C>
auto container_index(C const& container) -> decltype(boost::irange(0, container.size())) {
return boost::irange(0, container.size());
}
for(auto x : container_index(xs))
或一个迭代函数:
template<typename F>
void index_iterate(std::size_t size, F func) {
for(std::size_t i = 0; i != size; ++i) {
func(i);
}
}
index_iterate(container.size(), [&](std::size_t i){ /* ... */ });
只要可能就使用简单的循环。
可以组合使用两种方法:
int i = 0;
for ( auto x : v ) {
// do smth with x or v[i] or i
i++;
}
相关文章:
- 复制和交换习惯用法与移动操作之间的交互
- 命名参数习惯用法和(抽象)基类
- 复制交换习惯用法-我们可以在这里使用动态强制转换操作吗
- 错误:使用复制和交换习惯用法的交换函数中"operator="的重载不明确
- 使用 PIMPL 惯用法,实现是否应始终是类的私有成员?
- C++移动分配可防止复制交换习惯用法
- 将 PIMPL 习惯用法与成员函数模板一起使用(无需预先了解所有可能的数据类型)
- 使用新线程在类似于 Scott Meyer 的单例习惯用法的实现中实例化单例是否安全?
- Pimpl习惯用法、单独的接口/实现文件和多个虚拟继承.如何
- C++迭代器"for loop"习惯用法,其步长> 1 并允许非随机访问反向迭代器
- 访问基类型数组成员(Int-to-type习惯用法)
- 基于智能指针的 CRTP 习惯用法的编译问题
- 通过C接口分配和释放资源的正确习惯用法
- 副本交换习惯用法的有效性
- 视图和控制器之间接口的习惯用法
- Boost:创建一组线程并等待所有线程的正确习惯用法是什么
- 当涉及分配器时,是否有类似于复制和交换习惯用法的东西
- 是具有复制和交换习惯用法的复制赋值运算符,建议进行自赋值检查
- C++或D:在没有动态调度的情况下解耦类的习惯用法
- 标准::rel_ops的惯用法