[英]return value iterator of std::generate_n, what can you do with it?
出於好奇!
你可以用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.