我查看了文档,但找不到具体的答案。它是依赖于实现的吗?
答案 0 :(得分:8)
你所保证的是:
因此,实现需要多少额外的实现取决于实现。我认为大多数会在复制时使容量匹配大小,但它不能降低容量。 (由于上面的数字2;不允许在有足够空间的情况下重新分配。)
*主要是。请参阅Charles的评论。
答案 1 :(得分:2)
vector :: operator =改变矢量容量吗?如果是这样,怎么样?
它可能会改变容量。仅当先前容量太小而无法容纳新尺寸时才会发生这种情况。如果是这样,新容量至少等于新容量,但可能是更大的值。
复制构造函数是否复制容量?
根据表65 C ++ 03中的容器需求,X u (a);
和X u = a;
都等同于X u; u = a;
。在默认构造向量之后,这使得copy ctor与op = case相同。
答案 2 :(得分:1)
正如我之前所写,副本不需要 - 通常也不会 - 保留原始载体的容量。
gcc version 4.1.1
$ cat vt.cpp
#include <vector>
#include <iostream>
int main() {
std::vector<int> v1;
v1.reserve(50000);
std::vector<int> v2 = v1;
std::cout << v1.capacity() << std::endl;
std::cout << v2.capacity() << std::endl;
return 0;
}
$ g++ vt.cpp -o vt && ./vt
50000
0
$ cat v2.cpp
#include <vector>
#include <iostream>
int main() {
std::vector<int> v1;
v1.reserve(50000);
std::vector<int> v2;
v2 = v1;
std::cout << v1.capacity() << std::endl;
std::cout << v2.capacity() << std::endl;
return 0;
}
$ g++ v2.cpp -o v2 && ./v2
50000
0
答案 3 :(得分:0)
template <class _Tp, class _Alloc>
vector<_Tp,_Alloc>&
vector<_Tp,_Alloc>::operator=(const vector<_Tp, _Alloc>& __x)
{
if (&__x != this) {
const size_type __xlen = __x.size();
if (__xlen > capacity()) {
iterator __tmp = _M_allocate_and_copy(__xlen, __x.begin(), __x.end());
destroy(_M_start, _M_finish);
_M_deallocate(_M_start, _M_end_of_storage - _M_start);
_M_start = __tmp;
_M_end_of_storage = _M_start + __xlen;
}
else if (size() >= __xlen) {
iterator __i = copy(__x.begin(), __x.end(), begin());
destroy(__i, _M_finish);
}
else {
copy(__x.begin(), __x.begin() + size(), _M_start);
uninitialized_copy(__x.begin() + size(), __x.end(), _M_finish);
}
_M_finish = _M_start + __xlen;
}
return *this;
}
template <class _InputIterator>
vector(_InputIterator __first, _InputIterator __last,
const allocator_type& __a = allocator_type()) : _Base(__a) {
typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
_M_initialize_aux(__first, __last, _Integral());
}
template <class _Integer>
void _M_initialize_aux(_Integer __n, _Integer __value, __true_type) {
_M_start = _M_allocate(__n);
_M_end_of_storage = _M_start + __n;
_M_finish = uninitialized_fill_n(_M_start, __n, __value);
}
答案 4 :(得分:-2)
它取决于实现。大多数实际上将矢量缩小到最小尺寸。