簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM