STL容器之vector学习。

 

平时写程序的时候,用到的vector容器是非常多了。今天系统整理一下vector 内部的一些方法。

 

Vector 是一种顺序性的容器,按照严格线性存储各种对象。他其实就是一种动态的数组,正如数组,、vector有他们存储在存储单元相邻元素,这就意味着他们的元素可以被存取不只有使用迭代器还定期使用指针抵消元素。但是不像普通的数组,存储在向量自动处理,允许它的扩展和简约的需要。

 

Vector 可以方便的做一下:

  • 可以通过下标直接访问元素 (常量时间).    
  • 用任何顺序迭代元素(linear time).
  • 在尾部添加删除元素 (constant amortized     time).       

 

在C++ Standard Template Library 中,vector有两个参数

   
 

template < class T, class  Allocator = allocator<T> > class vector;

 

这两个参数的意义:

  • T: 元素的类型
  • Allocator: 元素所要分配的空间大小。

下面就一一介绍Vector的内部方法

1	vector构造函数:也就是如何对一个vec对象进行初始化。
代码//
explicit vector ( const Allocator& = Allocator() );
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
template <class InputIterator>
         vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );
vector ( const vector<T,Allocator>& x );
代码//
参数解释:n,初始化元素个数。 T,你所要添加进去的元素。
First,容器第一个元素,last最后一个元素,一个vector的引用。
示例:
// constructing vectors
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  unsigned int i;

  // constructors used in the same order as described above:
  vector<int> first;            // 初始化一个int类型的空vector变量
  vector<int> second (4,100);             // 初始化4个100
  vector<int> third (second.begin(),second.end());  
// 通过second 进行赋值
  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};
  vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );

  cout << "The contents of fifth are:";
  for (i=0; i < fifth.size(); i++)
    cout << " " << fifth[i];

  cout << endl;

  return 0;
}
输出结果:
The contents of fifth are: 16 2 77 29 
2	vector::~vector析构函数
调用每一个元素对象的析构函数




成员函数
3	vector::assign
template <class InputIterator>
  void assign ( InputIterator first, InputIterator last );

void assign ( size_type n, const T& u );

如 c.assign(beg,end)c.assign(n,elem)
  将[beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。

示例:
// vector assign
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> first;
  vector<int> second;
  vector<int> third;

  first.assign (7,100);             // a repetition 7 times of value 100

  vector<int>::iterator it;
  it=first.begin()+1;

  second.assign (it,first.end()-1); // the 5 central values of first

  int myints[] = {1776,7,4};
  third.assign (myints,myints+3);   // assigning from array.

  cout << "Size of first: " << int (first.size()) << endl;
  cout << "Size of second: " << int (second.size()) << endl;
  cout << "Size of third: " << int (third.size()) << endl;
  return 0;
}



输出结果
Size of first: 7
Size of second: 5
Size of third: 3

4	vector::at
const_reference at ( size_type n ) const;
      reference at ( size_type n );

返回vector内的n的引用。
代码示例
// vec.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
// constructing vectors
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
	vector<int> myvector(10);//初始化10个为0的元素。
	unsigned int i;
	for (i=0;i<myvector.size();i++)
	{
		myvector.at(i)=i;
	}
	cout << "myvector contains:";
	for (i=0; i<myvector.size(); i++)
		cout << " " << myvector.at(i);
	
	cout << endl;
	
	return 0;	
}

5	vector::back

reference back ( );
const_reference back ( ) const;
返回上一个元素的引用
// vector::back
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> myvector;

  myvector.push_back(10);

  while (myvector.back() != 0)
  {
    myvector.push_back ( myvector.back() -1 );
  }

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

  cout << endl;

  return 0;
}
Output:
myvector contains: 10 9 8 7 6 5 4 3 2 1 0
vector::begin
iterator begin ();
const_iterator begin () const;
示例
// vector::begin
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> myvector;
  for (int i=1; i<=5; i++) myvector.push_back(i);

  vector<int>::iterator it;

  cout << "myvector contains:";
  for ( it=myvector.begin() ; it < myvector.end(); it++ )
    cout << " " << *it;

  cout << endl;

  return 0;
}
Output:
myvector contains: 1 2 3 4 5
6	vector::capacity
返回vector对象存储空间大小

例子:
// comparing size, capacity and max_size
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> myvector;

  // set some content in the vector:
  for (int i=0; i<100; i++) myvector.push_back(i);

  cout << "size: " << (int) myvector.size() << "\n";
  cout << "capacity: " << (int) myvector.capacity() << "\n";
  cout << "max_size: " << (int) myvector.max_size() << "\n";
  return 0;
}
A possible output for this program could be:
size: 100
capacity: 141
max_size: 1073741823
7	vector::clear
清除对象内的所有元素,就是调用了析构函数,清空,然后为0

示例
// clearing vectors
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  unsigned int i;
  vector<int> myvector;
  myvector.push_back (100);
  myvector.push_back (200);
  myvector.push_back (300);

  cout << "myvector contains:";
  for (i=0; i<myvector.size(); i++) cout << " " << myvector[i];

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

  cout << "\nmyvector contains:";
  for (i=0; i<myvector.size(); i++) cout << " " << myvector[i];

  cout << endl;

  return 0;
}
8	vector::empty
bool empty () const; 判断vector对象时否为空。
示例:
// vector::empty
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> myvector;
  int sum (0);

  for (int i=1;i<=10;i++) myvector.push_back(i);

  while (!myvector.empty())
  {
     sum += myvector.back();
     myvector.pop_back();
  }

  cout << "total: " << sum << endl;
  
  return 0;
}
9	vector::end
iterator end ();
const_iterator end () const;

Returns an iterator referring to the past-the-end element in the vector container.
Both iterator and const_iterator are member types. In the vector class template, these are random access iterators

// test_vector.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> myvec;
	for (int i=0;i<6;i++)
	{
		myvec.insert(myvec.end(),i);
	}
	cout<<"element";
	vector<int>::iterator it;
	for (it=myvec.begin();it<myvec.end();it++)
	{
		cout<<" "<<(*it)<<endl;
	}
	return 0;
}


10	vector::erase

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

删除vector对象里的一个元素或者一个范围内的元素([first,last)).

示例:
// erasing from vector
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  unsigned int i;
  vector<unsigned int> myvector;

  // set some values (from 1 to 10)
  for (i=1; i<=10; i++) myvector.push_back(i);
  
  // erase the 6th element
  myvector.erase (myvector.begin()+5);

  // erase the first 3 elements:
  myvector.erase (myvector.begin(),myvector.begin()+3);

  cout << "myvector contains:";
  for (i=0; i<myvector.size(); i++)
    cout << " " << myvector[i];
  cout << endl;

  return 0;
}
Output:
myvector contains: 4 5 7 8 9 10

11	vector::front

  reference front ( );
const_reference front ( ) const;

Returns a reference to the first element in the vector container.

#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> myvector;

  myvector.push_back(78);
  myvector.push_back(16);

  // now front equals 78, and back 16

  myvector.front() -= myvector.back();

  cout << "myvector.front() is now " << myvector.front() << endl;

  return 0;
}

Output:
myvector.front() is now 62
12	vector::get_allocator
allocator_type get_allocator() const;
// test_vector.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> myvector;
	int* p;
	unsigned int i;

	p=myvector.get_allocator().allocate(5);
	for (int i=0;i<5;i++)
	{
		p[i]=i;
	}
	cout << "The allocated array contains:";
	for (i=0; i<5; i++) cout << " " << p[i];
	cout << endl;
	myvector.get_allocator().deallocate(p,5);


	return 0;
}
The allocated array contains: 0 1 2 3 4

13	vector::insert
iterator insert ( iterator position, const T& x );
    void insert ( iterator position, size_type n, const T& x );
template <class InputIterator>
void insert ( iterator position, InputI	 last );
// test_vector.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> myvector(3,100);
	vector<int> ::iterator it;
	it=myvector.begin();
	it=myvector.insert(it,200);
	myvector.insert(it,2,300);

	it=myvector.begin();

	vector<int> anothervector(2,400);
	myvector.insert(it+2,anothervector.begin(),anothervector.end());
	

	int array[]={501,502,503};
	myvector.insert(myvector.begin(),array,array+3);

	cout << "myvector contains:";
	
	for (vector<int>::iterator it=myvector.begin();it<myvector.end();it++)
	{
		cout<<" "<<*it;
	}

	return 0;

}

Output:
myvector contains: 501 502 503 300 300 400 400 200 100 100 100
14	vector::max_size
size_type max_size () const;

返回改容器能持有的最大元素数,看一下例子,查看区别

// comparing size, capacity and max_size
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> myvector;

  // set some content in the vector:
  for (int i=0; i<100; i++) myvector.push_back(i);

  cout << "size: " << myvector.size() << "\n";
  cout << "capacity: " << myvector.capacity() << "\n";
  cout << "max_size: " << myvector.max_size() << "\n";
  return 0;
}
A possible output for this program could be:
size: 100
capacity: 141
max_size: 1073741823
15	vector::operator=

vector<T,Allocator>& operator= (const vector<T,Allocator>& x);

重载“=”操作符

// vector assignment
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> first (3,0);
  vector<int> second (5,0);

  second=first;
  first=vector<int>();

  cout << "Size of first: " << int (first.size()) << endl;
  cout << "Size of second: " << int (second.size()) << endl;
  return 0;
}
输出结果:
Size of first: 0
Size of second: 3

16	vector::operator[]
  reference operator[] ( size_type n );
const_reference operator[] ( size_type n ) const;

Returns a reference to the element at position n in the vector container.
返回vector容器内位置为n的元素的引用
和at()函数相同的功能,就是at()不在范围内会抛异常
示例
// test_vector.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> myvector(10);
	unsigned int i;
	vector<int> ::size_type size=myvector.size();
	for (i=0;i<10;i++)
	{
		myvector[i]=i;
	}
	for (i=0;i<size/2;i++)
	{
		int temp=myvector[size-1-i];
		myvector[size-1-i]=myvector[i];
		myvector[i]=temp;
	}
	for (i=0;i<10;i++)
	{
		cout<<" "<<myvector[i];
	}
	cout<<endl;
	return 0;
}

Output:
myvector contains: 9 8 7 6 5 4 3 2 1 0
17	vector::pop_back
void pop_back ( );

移出元素
示例
// vector::pop_back
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> myvector;
  int sum (0);
  myvector.push_back (100);
  myvector.push_back (200);
  myvector.push_back (300);

  while (!myvector.empty())
  {
    sum+=myvector.back();
    myvector.pop_back();
  }

  cout << "The elements of myvector summed " << sum << endl;

  return 0;
}
输出结果:The elements of myvector summed 600
18	vector::push_back
void push_back ( const T& x );

在末尾处添加一个元素
// vector::push_back
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> myvector;
  int myint;

  cout << "Please enter some integers (enter 0 to end):\n";

  do {
    cin >> myint;
    myvector.push_back (myint);
  } while (myint);

  cout << "myvector stores " << (int) myvector.size() << " numbers.\n";

  return 0;
}
19	vector::rbegin

reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

按照反序迭代输出
示例

// test_vector.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> myvector(10);
	unsigned int i;
	vector<int> ::size_type size=myvector.size();
	for (i=0;i<10;i++)
	{
		myvector[i]=i;
	}
	vector<int>::reverse_iterator it;
	for (it=myvector.rbegin();it<myvector.rend();it ++)
	{
		cout<<" "<<*it;
	}
	cout<<endl;
	return 0;
}

输出结果:9  8 7 6 5 4 3 2 1 0

20	vector::rend
public member function
      reverse_iterator rend();
const_reverse_iterator rend() const;


代码 同上

21	vector::reserve
void reserve ( size_type n );
Request a change in capacity
Requests that the capacity of the allocated storage space for the elements of the vector container be at least enough to hold n elements.	

示例
// vector::reserve
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> content;
  size_t filesize;

  ifstream file ("test.bin",ios::in|ios::ate|ios::binary);
  if (file.is_open())
  {
    filesize=file.tellg();

    content.reserve(filesize);

    file.seekg(0);
    while (!file.eof())
    {
      content.push_back( file.get() );
    }

    // print out content:
    vector<int>::iterator it;
    for (it=content.begin() ; it<content.end() ; it++)
      cout << hex << *it;
  }

  return 0;
}

22	vector::resize

void resize ( size_type sz, T c = T() );

// resizing vector
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> myvector;

  unsigned int i;

  // set some initial content:
  for (i=1;i<10;i++) myvector.push_back(i);

  myvector.resize(5);
  myvector.resize(8,100);
  myvector.resize(12);

  cout << "myvector contains:";
  for (i=0;i<myvector.size();i++)
    cout << " " << myvector[i];

  cout << endl;

  return 0;
}
myvector contains: 1 2 3 4 5 100 100 100 0 0 0 0

23	vector::size
size_type size() const;
返回元素个数	

示例:
// vector::size
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> myints;
  cout << "0. size: " << (int) myints.size() << endl;

  for (int i=0; i<10; i++) myints.push_back(i);
  cout << "1. size: " << (int) myints.size() << endl;

  myints.insert (myints.end(),10,100);
  cout << "2. size: " << (int) myints.size() << endl;

  myints.pop_back();
  cout << "3. size: " << (int) myints.size() << endl;

  return 0;
}

Output:
0. size: 0
1. size: 10
2. size: 20
3. size: 19
24	vector::swap
交换vector对象里的数据
// swap vectors
#include <iostream>
#include <vector>
using namespace std;

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

  first.swap(second);

  cout << "first contains:";
  for (i=0; i<first.size(); i++) cout << " " << first[i];

  cout << "\nsecond contains:";
  for (i=0; i<second.size(); i++) cout << " " << second[i];

  cout << endl;

  return 0;
Output:
first contains: 200 200 200 200 200 
second contains: 100 100 100 


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐