std::generate_n的返回值迭代器,你能用它做什么?



出于好奇!

你能用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_niterator

您可以使用它将元素插入到容器中。

给定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
<小时 />

相关内容

  • 没有找到相关文章

最新更新