出于好奇!
你能用std::generate_n
的返回iterator
做什么?
返回值 :
迭代器一个经过分配的最后一个元素,如果
count > 0
,否则先。
std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto iterator = std::generate_n(std::back_inserter(v), 10, [&]() {return j++;});
std::cout << "type: " << typeid(iterator).name() << 'n';
/*
for (iterator = v.begin(); iterator< v.end(); iterator++){
std::cout << *iterator << " " << endl;
}
*/
for(auto a : v)
std::cout << a << " ";
std::cout << std::endl;
输出:
type: St20back_insert_iteratorISt6vectorIiSaIiEEE
1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9
iterator
显示了一些成员函数,但它们大多是运算符。
它是一个输出迭代器。您可以像使用任何输出迭代器一样使用它。它是您作为第一个参数传递的相同类型 - 即使未生成任何值时也是如此。
后部插入器并不是一个理想的例子,因为它并不真正关心位置(有趣的事实:增加后插入器没有任何作用)。一个更重要的用例是现有元素的迭代器,在这种情况下,我们关心的是我们正在写入哪些元素。
一个扩展示例,对同一容器使用两个不同的生成器:
auto generator1 = [&]() { return j++; };
auto generator2 = [&]() { return j--; };
auto it = v.begin();
it = std::generate_n(it, 5, generator1);
it = std::generate_n(it, 5, generator2);
假设你想为前半部分生成元素,然后在后半部分使用不同的生成器,那么你可以简单地编写:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
int j = 0;
std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto iterator = std::generate_n(v.begin(), 5, [&]() {return j++;});
std::generate_n(iterator,5,[&](){ return j;});
for (auto i : v){
std::cout << i << " ";
}
}
无需手动计算指向第一次调用之后元素的iterator
。
输出为:
0 1 2 3 4 5 5 5 5 5
在您的示例中,iterator
只是一个迭代器,超过向量的最后一个元素,并没有带来很大的优势,因为它与v.end()
相同。
你能做什么返回
std::generate_n
iterator
?
您可以使用它将元素插入到容器中。
给定std::generate_n
返回一个std::back_insert_iterator
,如 std::back_insert_iterator 中所定义:
std::back_insert_iterator 是一个 LegacyOutputIterator,它附加到为其构建的容器。每当迭代器(无论是否取消引用)被分配到时,都会调用容器的
push_back()
成员函数。递增std::back_insert_iterator
是无操作的。
实际上,您的代码正在做的是将另外 10 个int
附加到std::vector
。我想j
是用0
初始化的,如果不是,你可能会调用未定义的行为。
返回值:
迭代器一个经过最后一个分配的元素,如果
count > 0
,否则首先。
它总是指向应该插入新元素的最后一个元素,如果容器为空,它将指向容器的第一个元素,这也是应该插入新元素的位置。
例:
iterator = 25;
将25
附加到向量,您的输出将是:
1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 25
<小时 />