【问题标题】:Empty iterator range in vector constructor向量构造函数中的空迭代器范围
【发布时间】:2018-06-06 10:14:13
【问题描述】:

在向量构造函数中传递空的迭代器范围是否有效? IE。在下面的代码中会是未定义的行为吗?

std::set<int> empty_set;
std::vector<int> target_vector(empty_set.begin(), empty_set.end());

根据cppreference的解释,这个构造函数:

使用范围 [first, last) 的内容构造容器。

这是否意味着 first 必须是可取消引用的?

【问题讨论】:

  • 很好的数学类比:[0.0; 0.0) 也是空的...

标签: c++ stl


【解决方案1】:

从空范围构造std::vector 是完全合法的。如果first==last,则新向量将没有元素,first 不会被取消引用。

您拥有的代码定义明确,并且符合您的预期。


由于指针可以用作迭代器,这甚至意味着这段代码是明确定义的(并且返回零):

#include <vector>

int main()
{
    int const* const p = nullptr;
    std::vector<int> v(p, p);
    return v.size();
}

【讨论】:

    【解决方案2】:

    不,没有这样的要求。

    它分配大小为 std::distance(first, last) 的内存然后在循环中复制容器。

    【讨论】:

    • IIRC 它分配至少那个大小,但可能更多。不过,通常你并不关心.capacity()
    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2021-05-02
    • 2010-10-19
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2014-07-28
    相关资源
    最近更新 更多