array迭代器 图片看不了?点击切换HTTP 返回上层
数组模板定义了成员函数 begin() 和 end(),分别返回指向第一个元素和最后一个元素的下一个位置的随机访问迭代器。如前面章节所述,随机访问迭代器具有最多的功能,能使用它进行全部的操作。可以在循环中显式地使用迭代器来设置 height_ins 容器的值:
1 2 3 4 5 6 7 8 | unsigned int h {min_ht}; auto first = height_ins. begin (); auto last = height_ins. end () ; while ( first != last ) { * first ++=h; h += ht_step; } |
如前面章节所述,最好用全局的 begin() 和 end() 函数来从容器中获取迭代器,因为它们是通用的,first 和 last 可以像下面这样定义:
1 2 | auto first = std:: begin (height_ins); auto last = std:: end (height_ins); |
定义在 algorithm 头文件中的 generate() 函数模板,提供了用函数对象计算值、初始化一切元素的可能。我们可以像这样重写之前用来初始化 height_ins 容器的代码段:
1 2 3 | unsigned int height {}; std::generate(std:: begin (height_ins), std:: end (height_ins),[height, &min_ht, &ht_step]()mutable { return height += height == 0 ? min_ht : ht_step; }); |
在 return 语句中,lambda 第一次执行后,height 的局部副本的值被设为 min_ht。然后,随着 lambda 的每次调用,height 都会增加 ht_step。 在 lambda 表达式中,以值引用的方式捕获的变量局部副本的值会被一直保存,这一机制正好满足了我们的要求。
假定要用连续的递增值初始化一个数组容器,这里有一个函数模板 iota() 可以做到,它定义在头文件 numeric 中。这里有一个它的用法示例:
1 2 3 | std::array< double , 10> values ; std::iota(std:: begin ( values ), std:: end ( values ),10.0); elements to 10.0 to 19.0 |
注意,不要忘记算法是独立于容器类型的,对于任何具有指定类型迭代器的容器来说,算法都可以应用到它们的元素上。generate() 和 iota() 函数模板只需要正向迭代器,所以用来指定任何容器的元素范围的迭代器都能发挥作用。
容器定义了成员函数 cbegin() 和 cend(),它们可以返回 const 迭代器。当只想访问元素时,应该使用 const 迭代器。对于 non-const 迭代器,最好使用全局的 cbegin 和 cend() 来获取。全局函数或成员函数 rbegin() 和 rend() 可以分别得到指向最一个元素和第一个元素前一个位置的反向迭代器。函数 crbegin() 和 crend() 可以返回 const 反向迭代器。我们可以用反向迭代器以逆序方式处理元素。例如:
1 2 3 4 5 6 7 | std::array< double , 5> these {1.0, 2.0, 3.0, 4.0, 5.0}; double sum {}; auto start = std::rbegin(these); auto finish = std::rend(these); while(start != finish) sum += *(start++}; std::cout << "The sum of elements in reverse order is " << sum << std::endl; |
1 2 | for (auto iter = std::rbegin (these); iter != std::rend(these); ++iter) sum += *iter; |