15
  • vector :: operator =はベクトル容量を変更しますか?もしそうなら、どのように?
  • ベクトルのコピーコンストラクターは容量をコピーしますか?

ドキュメントを調べましたが、具体的な答えが見つかりませんでした。実装に依存しますか?

4

5 に答える 5

9

保証されるのは次のことだけです。

  1. ベクトルには、その要素を格納するのに十分な容量があります。(明らかに。)
  2. 現在の容量がいっぱいになるまで、ベクターは新しい容量を取得しません。*

したがって、実装がどれだけ余分に、または少しだけ入れたいかは、実装次第です。ほとんどの場合、コピー時に容量をサイズに合わせると思いますが、容量を下げることはできません。(上記の2番のため、十分なスペースがあるときに再割り当てすることはできません。)

* 多くの場合。以下のチャールズのコメントを参照してください。

于 2010-04-18T17:29:48.637 に答える
2

vector :: operator =はベクトル容量を変更しますか?もしそうなら、どのように?

容量が変わる場合があります。これは、以前の容量が小さすぎて新しいサイズを保持できない場合にのみ発生します。その場合、新しい容量は少なくとも新しいサイズと同じですが、より大きな値になる可能性があります。

コピーコンストラクターは容量をコピーしますか?

表65によると、C ++ 03のコンテナ要件でX u (a);ありX u = a;、どちらも。と同等X u; u = a;です。これにより、デフォルトでベクトルが作成された後、copyctorはop=の場合と同じになります。

于 2010-04-18T18:43:36.380 に答える
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
于 2010-04-18T17:53:33.570 に答える
0
  1. SGI STLベクトルソースコードが以下に示すように、operator =は正確にn個の要素のためにスペースを予約します。つまり、_M_end_of_storage = _M_start + __xlen;
    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;
    }
  1. SGI STLベクターソースコードが以下に示すように、ベクターのコピーコンストラクターは正確にn個の要素用のスペースを予約します。つまり、_M_end_of_storage = _M_start + __n;
      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);
      }
于 2020-05-28T06:54:55.360 に答える
-2

実装に依存します。ほとんどの場合、ベクトルを最小サイズに縮小します。

于 2010-04-18T17:29:12.677 に答える