当insert
为空时,将其放入名为myvec
的std::vector
是否合法?像这样:
myvec.insert(myvec.end(), other.begin(), other.end());
我不确定myvec.end()
在这种情况下会指向哪里。
此外,当myvec
为空时,上面的与下面的不同吗?
myvec.insert(myvec.begin(), other.begin(), other.end());
这些合法吗?
C++20最终工作草案22.2.1一般集装箱要求[container.requirements.General]
- begin((返回一个迭代器,该迭代器引用容器end((返回一个迭代器,该迭代器超过了结束值用于容器。如果容器是空的,那么begin((==end((
是的,它们是一样的。它们合法吗?
从std::vector
上的cppreference插入
template< class InputIt >
void insert( iterator pos, InputIt first, InputIt last);
迭代器位置有效吗?(即空向量的std::开始(。是的,但你不能取消引用它。
是的,这是完全合法的。来自cppreference:
如果新的size((大于旧的capacity((,则导致重新分配。如果新尺寸((大于容量((,
当myvec为空时,上面的与下面的不同吗?
否,因为当向量为空时,vector::begin() == vector::end()
。所以它们都是一样的。
根据定义,容器在begin() == end()
时为empty
。有关详细信息,请参阅此答案。换句话说,end()
和begin()
可以在空容器上使用(尽管不能取消引用它们(。因此,在调用算法时,空向量并不构成特殊情况。如果
myvec.insert(myvec.end(), other.begin(), other.end());
对于具有元素的myvec
是可以的,那么对于空的myvec
也是可以的(并且other
是否具有元素不需要对该调用进行额外处理(。