【问题标题】:c++ std::vector iterator constructor with first == lastc++ std::vector 迭代器构造函数,第一个 == 最后一个
【发布时间】:2019-12-07 09:14:59
【问题描述】:

我有一个函数需要将一个向量分成 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&lt;uint8_t&gt;(iter, iter + size)。 c++ 标准是否允许在 first == last 时使用其范围构造函数构造向量?

根据cplusplus.com,“使用的范围是[first,last),其中包括first和last之间的所有元素,包括first指向的元素但不包括last指向的元素”,但该语句没有'当 first == last 时没有任何意义?

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

【问题讨论】:

    标签: c++ vector stdvector


    【解决方案1】:

    来自iterator.requirements.general的标准:

    表示范围的迭代器和标记是可比较的。如果 i == s,则范围 [i, s) 为空;否则[...]

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

    【讨论】:

    • 感谢您的提示!我已经更新了我的答案的文本。
    【解决方案2】:

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

    【讨论】:

    • 你能提供这个来源吗?最好是标准的东西。我知道从数学的角度来看,[a, a) 是空集,但这并不一定意味着与 c++ 相关。
    • @DanielMcIntosh 到目前为止我发现的是vector.cons。其中 N 是第一个和最后一个之间的距离(或在空范围的情况下为 0)。它对复制构造函数进行了 0 次调用。
    • @DanielMcIntosh 或 sequence.reqmts, Table 66确保: 距离(开始(),结束())== 距离(i,j)”。我解释为当给定一个空范围时,生成的容器大小将为 0。请注意,我不是标准专家。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2011-02-10
    • 2011-01-13
    相关资源
    最近更新 更多