繁体   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