c++ std::vector 带有第一个 == 最后一个的迭代器构造函数

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)。当 first == last 时,c++ 标准是否允许使用其范围构造函数构造向量?

根据 cplusplus.com、"The range used is [first,last), which includes all the elements between first and last, including the element pointed by first but not the element pointed by last",但是当 first == last?

时该语句没有任何意义?

我在网上试过运行它IDE,它似乎有效(https://ideone.com/V9hylA),所以它显然没有被禁止,但它是未定义的行为吗?

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

来自标准的iterator.requirements.general

An iterator and a sentinel denoting a range are comparable. A range [i, s) is empty if i == s; otherwise [...]

所以当 first == last 时,标准明确将其定义为空范围。