簡體   English   中英

C ++ std :: vector迭代器構造函數,第一個== last

[英]c++ std::vector iterator constructor with first == last

我有一個功能,需要將一個向量划分為n個子向量。 例如,它可能看起來像這樣:

void foo(std::vector<uint8_t> vec, int numSubVectors){
    size_t size = vec.size() / numSubVectors;
    auto iter = vec.begin();
    for (int i = 0; i < numSubVectors; ++i) {
        auto sub_vec = std::vector<uint8_t>(iter, iter + size);
        // do something with sub_vec
        // ...

        iter += size;
    }
}

當用foo({}, 1)調用時,我需要它來工作,其中sub_vec在循環的第一個(也是唯一的)迭代中被分配了一個空向量。 我擔心std::vector<uint8_t>(iter, iter + size) 當第一個== last時,c ++標准是否允許使用其范圍構造函數構造向量?

根據cplusplus.com的說法 ,“使用的范圍是[first,last),其中包括first和last之間的所有元素,包括first所指向的元素,而不是last所指向的元素”,但是該語句沒有任何作用。何時第一個==最后一個感覺?

我嘗試在在線IDE上運行它,並且似乎可以正常工作( https://ideone.com/V9hylA ),因此顯然不禁止使用它,但是它的行為不確定嗎?

來自標准的iterator.requirements.general

表示范圍的迭代器和標記是可比較的。 如果i == s,則范圍[i,s)為空; 除此以外 [...]

因此,當first == last時,標准將其明確定義為空范圍。

first == last的迭代器對[first, last)是我們定義一個空范圍的方式。 在語法和邏輯上都是有效的。 從該迭代器對構造一個std::vector會做正確的事情,並創建一個空容器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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