如何解决返回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,generator2);
,
假设您要在上半部分生成元素,然后在下半部分使用其他生成器,则只需编写以下内容:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
int j = 0;
std::vector<int> v{1,2,3,4,6,7,8,9,10};
auto iterator = std::generate_n(v.begin(),[&]() {return j++;});
std::generate_n(iterator,[&](){ return j;});
for (auto i : v){
std::cout << i << " ";
}
}
无需手动计算指向第一次调用中元素之后的元素的iterator
。
输出为:
0 1 2 3 4 5 5 5 5 5
在您的示例中,iterator
只是一个向量的最后一个元素之后的迭代器,并没有太大的优势,因为它与v.end()
相同。
您可以怎么做
iterator
的{{1}}返回?
您可以使用它将元素插入到容器中。
鉴于std::generate_n
返回了std::back_insert_iterator中定义的std::generate_n
:
std :: back_insert_iterator是一个LegacyOutputIterator,它附加到为其构造容器中。每当分配迭代器(无论是否取消引用)时,都会调用容器的
std::back_insert_iterator
成员函数。递增push_back()
是禁止操作。
有效地,您的代码正在将另外10个std::back_insert_iterator
附加到int
中。我可以想象std::vector
是用j
初始化的,如果没有初始化,您可能正在调用未定义的行为。
返回值:
如果是
0
,则迭代到最后分配的元素之后的迭代器,否则返回第一个。
它总是指向最后一个元素之后插入新元素的位置,如果容器为空,它将指向容器的第一个元素,再次插入新元素
示例:
count > 0
将iterator = 25;
附加到向量上,您的输出将是:
25
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。