vector 内部方法大全 学习(初学者的参考资料)

来源:互联网 发布:poi 岛风go 网络设置 编辑:程序博客网 时间:2024/06/07 17:42

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的内部方法

1vector构造函数:也就是如何对一个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 2vector::~vector析构函数调用每一个元素对象的析构函数成员函数3vector::assigntemplate <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: 7Size of second: 5Size of third: 34vector::atconst_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;}5vector::backreference 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 0vector::beginiterator 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 56vector::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: 100capacity: 141max_size: 10737418237vector::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;}8vector::emptybool 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;}9vector::enditerator 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;}10vector::eraseiterator 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 1011vector::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 6212vector::get_allocatorallocator_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 413vector::insertiterator 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 10014vector::max_sizesize_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: 100capacity: 141max_size: 107374182315vector::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: 0Size of second: 316vector::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 017vector::pop_backvoid 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 60018vector::push_backvoid 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;}19vector::rbeginreverse_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 020vector::rendpublic member function      reverse_iterator rend();const_reverse_iterator rend() const;代码 同上21vector::reservevoid reserve ( size_type n );Request a change in capacityRequests 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;}22vector::resizevoid 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 023vector::sizesize_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: 01. size: 102. size: 203. size: 1924vector::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