如果我将一个向量分配或复制到另一个(其容量与前者相同或更大),可以假定后者的缓冲区将被重用吗?
以下示例说明了我可以,但是,标准可以保证吗?
在这方面,std::vector::assign
和std::vector::operator=
的行为是否有区别?
#include <vector>
#include <iostream>
#include <cassert>
int main()
{
std::vector a {1, 2, 3, 4, 5};
std::vector b {1, 2, 3, 4};
std::vector c {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::cout << "1 ==== " << a.capacity() << " " << a.data() << std::endl;
const auto* pa = a.data();
a = b;
assert(pa == a.data());
std::cout << "2 ==== " << a.capacity() << " " << a.data() << std::endl;
a = c;
assert(pa != a.data());
std::cout << "3 ==== " << a.capacity() << " " << a.data() << std::endl;
}
更新:This answer提到了
void assign(size_type n, const T& t);
等同于
erase(begin(), end());
insert(begin(), n, t);
该标准是否真的以此方式制定,并且是否适用于std::vector::assign
的所有重载?
答案 0 :(得分:4)
否。
该标准未在vector
上手动定义这些操作。它仅将它们定义为容器的要求。 [vector]说
向量满足序列容器的容器和可逆容器(在[container.requirements]中的两个表中给出)的所有要求,包括大多数可选的序列容器要求([sequence.reqmts] ),可识别分配器的容器(表67),以及对于非bool的元素类型,可使用连续容器。没有提供push_front,pop_front和emplace_front成员函数。这里仅提供对这些表之一中未描述的矢量操作的描述,或其中存在附加语义信息的操作的描述。
仅提及Container requirements和Sequence container requirements这两个位置。没有任何证据支持您的假设。