c std :: vector迭代器构造函数,first == last

c++ std::vector iterator constructor with first == last

本文关键字:first last 迭代器 std vector 构造函数      更新时间:2023-10-16

i具有一个函数,需要将矢量划分为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)。C 标准是否允许使用其范围构造器构建向量时,当

根据cplusplus.com,"使用的范围是[第一个,最后(,其中包括第一个和最后一个之间的所有元素,包括第一个元素,而不是最后指向的元素,但不是最后指向的元素",但是该语句却不是't在第一个==最后一个?

时有意义

我尝试在在线IDE上运行它,并且似乎可以使用(https://ideone.com/v9hyla(,所以显然不是禁止的,但是它是未定义的行为吗?

来自迭代器。

迭代器和表示范围的哨兵是可比的。如果i == s,范围[i,s(是空的。否则[...]

因此,当第一个==最后,标准明确将其定义为空范围。

迭代器对[first, last)其中first == last是我们定义空范围的方式。它在句法和逻辑上都是有效的。从迭代器对构造std::vector将做正确的事情并创建一个空容器。