在向量构造函数中的空迭代器范围

时间:2018-06-06 10:14:13

标签: c++ stl

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

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

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

  

使用范围[firstlast)的内容构造容器。

Doest意味着 first 必须是可解除引用的吗?

2 个答案:

答案 0 :(得分:8)

从空范围构造std::vector是完全合法的。如果first==last,则新向量将不包含任何元素,并且first将不会被解除引用。

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

由于指针可以用作迭代器,这甚至意味着这个代码定义良好(并返回零):

#include <vector>

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

答案 1 :(得分:2)

不,没有这样的要求。

它分配内存的大小std :: distance(first,last)然后在环路中复制包含。