vector容器的相关操作和string非常相似.

构造函数

  1. default (1)

     explicit vector (const allocator_type& alloc = allocator_type());
    
  2. fill (2)

     explicit vector (size_type n);
      vector (size_type n, const value_type& val,
              const allocator_type& alloc = allocator_type());
    
  3. range (3)

     template <class InputIterator>
     vector (InputIterator first, InputIterator last,
       const allocator_type& alloc = allocator_type());
    
  4. copy (4)

     vector (const vector& x);
     vector (const vector& x, const allocator_type& alloc);
    
  5. move (5)

     vector (vector&& x);
     vector (vector&& x, const allocator_type& alloc);
    
  6. initializer list (6)

     vector (initializer_list<value_type> il,
      const allocator_type& alloc = allocator_type());
    

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// constructing vectors
#include <iostream>
#include <vector>

int main ()
{
  // constructors used in the same order as described above:
  std::vector<int> first;                                // empty vector of ints
  std::vector<int> second (4,100);                       // four ints with value 100
  std::vector<int> third (second.begin(),second.end());  // iterating through second
  std::vector<int> fourth (third);                       // a copy of third

  // the iterator constructor can also be used to construct from arrays:
  int myints[] = {16,2,77,29};
  std::vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );

  std::cout << "The contents of fifth are:";
  for (std::vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

赋值运算符

  1. copy (1)

     vector& operator= (const vector& x);
    
  2. move (2)

     vector& operator= (vector&& x);
    
  3. initializer list (3)

     vector& operator= (initializer_list<value_type> il);
    

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> foo (3,0);
  std::vector<int> bar (5,0);

  bar = foo;
  foo = std::vector<int>();

  std::cout << "Size of foo: " << int(foo.size()) << '\n';
  std::cout << "Size of bar: " << int(bar.size()) << '\n';
  return 0;
}

迭代器

容量

元素访问

data函数

value_type* data() noexcept;
const value_type* data() const noexcept;

返回一个指向内存数组的直接指针,该指针由向量内部使用以存储其所拥有的元素。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// vector::data
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector (5);

  int* p = myvector.data();

  *p = 10;
  ++p;
  *p = 20;
  p[2] = 100;

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); ++i)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  return 0;
}

修改

##erase函数

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

指向由函数调用erase的最后一个元素后面的元素的新位置的迭代器。

如果操作擦除了序列中的最后一个元素,则这是容器结束。

clear函数

void clear() noexcept;

从vector中删除所有元素(被破坏),使容器的大小为0。

重新分配不能保证发生,由于调用此功能,vector capacity不能保证改变。强制重新分配的典型替代方法是使用交换:

vector<T>().swap(x);   // clear x reallocating

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;
  myvector.push_back (100);
  myvector.push_back (200);
  myvector.push_back (300);

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); i++)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  myvector.clear();
  myvector.push_back (1101);
  myvector.push_back (2202);

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); i++)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  return 0;
}

emplace函数

template <class... Args>
iterator emplace (const_iterator position, Args&&... args);

构造和插入元素

通过在位置插入一个新元素来扩展容器。这个新元素是使用args作为构造的参数来构建的。

这有效地将容器尺寸增加了一个。分配的存储空间的自动重新分配只有在新的vector大小超过当前的向量容量发生.

因为vector使用数组作为其底层存储,所以将元素插入到vector两端以外的位置时,会导致容器将所有位置之后的元素移位到新的位置。与其他类型的序列容器(例如list或forward_list)执行的操作相比,这通常是一个低效的操作。

元素通过使用转发的args调用allocator_traits :: construct来就地构建。

存在类似的成员函数insert,它将现有对象复制或移动到容器中。请参阅emplace_back一个成员函数,直接在最后扩展容器。元素通过使用转发的args调用allocator_traits :: construct来就地构建。存在类似的成员函数insert,它将现有对象复制或移动到容器中。

它们俩的区别在于新元素的构造上。emplace 使用直接构造,insert 使用复制构造

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector = {10,20,30};

  auto it = myvector.emplace ( myvector.begin()+1, 100 );
  myvector.emplace ( it, 200 );
  myvector.emplace ( myvector.end(), 300 );

  std::cout << "myvector contains:";
  for (auto& x: myvector)
    std::cout << ' ' << x;
  std::cout << '\n';

  return 0;
}

emplace_back函数

template <class... Args>
void emplace_back (Args&&... args);

在向量的末尾插入一个新的元素,就在其最后一个元素之后。这个新元素是使用args作为构造函数的参数构建的。

元素通过使用转发的args调用allocator_traits :: construct来就地构建。 存在类似的成员函数push_back,它将现有对象复制或移动到容器中。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector = {10,20,30};

  myvector.emplace_back (100);
  myvector.emplace_back (200);

  std::cout << "myvector contains:";
  for (auto& x: myvector)
    std::cout << ' ' << x;
  std::cout << '\n';

  return 0;
}

分配器

重载

relational operators

(1)

	template <class T, class Alloc>
	  bool operator== (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);

(2)

	template <class T, class Alloc>
	  bool operator!= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);

(3)

	template <class T, class Alloc>
	  bool operator<  (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);

(4)

	template <class T, class Alloc>
	  bool operator<= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);

(5)

	template <class T, class Alloc>
	  bool operator>  (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);

(6)

	template <class T, class Alloc>
	  bool operator>= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> foo (3,100);   // three ints with a value of 100
  std::vector<int> bar (2,200);   // two ints with a value of 200

  if (foo==bar) std::cout << "foo and bar are equal\n";
  if (foo!=bar) std::cout << "foo and bar are not equal\n";
  if (foo< bar) std::cout << "foo is less than bar\n";
  if (foo> bar) std::cout << "foo is greater than bar\n";
  if (foo<=bar) std::cout << "foo is less than or equal to bar\n";
  if (foo>=bar) std::cout << "foo is greater than or equal to bar\n";

  return 0;
}

swap函数

template <class T, class Alloc>
  void swap (vector<T,Alloc>& x, vector<T,Alloc>& y);

容器x的内容与y的内容交换。两个容器对象必须具有相同的类型(相同的模板参数),尽管大小可能不同。

调用该成员函数后,所有迭代器,引用和指针对交换对象仍然有效。

这是通用算法交换的重载,通过将其元素的所有权相互转移到另一个容器来提高其性能(即,容器交换对其数据的引用,而不实际执行任何元素复制或移动)

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// swap (vector overload)
#include <iostream>
#include <vector>

main ()
{
  unsigned int i;
  std::vector<int> foo (3,100);   // three ints with a value of 100
  std::vector<int> bar (5,200);   // five ints with a value of 200

  foo.swap(bar);

  std::cout << "foo contains:";
  for (std::vector<int>::iterator it = foo.begin(); it!=foo.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  std::cout << "bar contains:";
  for (std::vector<int>::iterator it = bar.begin(); it!=bar.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}