about vector

来源:互联网 发布:linux文本退出命令 编辑:程序博客网 时间:2024/06/09 17:31

先习惯大量使用std::vector吧。

class CTest {};
CTest array_test[ 3 ];  // 这里将三次调用CTest的构造函数来对数组的每个无素进行初始化.

以上数组不如用vector来代替,但以下的写法不好:
vector<CTest> vector_test( 3 ); 
这里会发现,先调用了一次CTest的一般构造函数,再调用三次CTest的拷贝构造函数,最后调用一次析构函数. 我这样理解: vector的长度为3, 它初始化时就需要三个CTest对象, 所以先调用一般构造函数创建一个临时的CTest对象, 再调用三次拷贝构造函数得到三个"拷贝"放到vector中,再调用析构函数去掉临时的CTest对象.

以上写法应该改成:
vector<CTest> vector_test;
vector_test.reserve( 3 );
这样写没有调用任何构造函数和析构函数(减少构造和拷贝就是目的).
reserve应该是向系统要了一块指定大小的空间,但由于vector里面还没有元素,因而并没有分配具体的内存, cout << vector_test.size( );  //输出0

往容器里放一个对象(如push_back等),放进的是这个对象的拷贝(执行拷贝函数), 从容器里面取出一个对象,取出的是这个对象的拷贝. 拷贝对象的操作对于stl容器来说是频繁的. 如果拷贝的动作开销很大, 就应该考虑往容器里面放指针,最好是智能指针,而不是放对象(因为指针的拷贝是很快的,而且不会像对象拷贝那样有那么多诸如数据丢失不准确等问题的顾虑).


以下代码是测试交换技巧的使用,交换的目的是使得vector容器的容量收缩,理论上收缩到跟它长度一样大(而临时的变量会马上销毁掉):
 {
  vector<long>  test_vec_src;
  test_vec_src.reserve( 1000 ); // size()==0, capacity()==1000
  for ( int nPos = 0; nPos < 1000; nPos ++ )
  {
   test_vec_src.push_back( nPos );
  }

  cout << "begin: size == " << test_vec_src.size() << "  capacity=="
   << test_vec_src.capacity() << endl;

  test_vec_src.clear(); // size==0, capactity==1000
  cout << "after clear: size == " << test_vec_src.size() << "  capacity == "
   << test_vec_src.capacity() << endl;

  test_vec_src.swap( vector<long>() ); // size==0, capacity==0
  cout << "after swap: size == " << test_vec_src.size() << "  capacity == "
   << test_vec_src.capacity() << endl;
 }

 {
  vector<long>  test_vec_src;
  test_vec_src.reserve( 1000 ); // size==0, capacity==1000
  for ( int nPos = 0; nPos < 100; nPos ++ )
  {
   test_vec_src.push_back( nPos );
  }

  cout << "begin: size == " << test_vec_src.size() << "  capacity=="
   << test_vec_src.capacity() << endl;

  test_vec_src.swap( vector<long>(test_vec_src) ); // size==100, apacity==100
  cout << "after swap: size == " << test_vec_src.size() << "  capacity == "
   << test_vec_src.capacity() << endl;

 }

 

据说,vector<bool>不是一个容器,理由是vector<bool>里面存放的不是bool,而是一个个bit,所以bool * pOneBool = &vector_bool[0]是没有意义的,pOneBool不会指向一个bool,而是指向一个bit(这有什么用呢!)。
为了使用bool的容器,可以使用deque<bool>,但它在内存上是不连续的;也可以使用c++里面的bitset,但bitset是一个静态数组,存放的也是bit。我还见过有人这样用: class  work_bool_array: public CArray<BOOL, BOOL> 使用了MFC里面的CArray(或又对这个类进行了改造再继承)。

尽量使用assign来初始化vector,避免使用循环:
template <class InputIterator>
void assign ( InputIterator first, InputIterator last );
void assign ( size_type n, const T& u );
例子:
 vector<int> first;
 first.assign( 10, 23 );  // 10个成员,每个值是23
 cout << "first size: " << first.size() << endl;  // 10
 for ( int nPos = 0; nPos < first.size(); nPos ++ )
  cout << first[nPos] << endl;

 vector<int> second;
 second.assign( first.begin()+1, first.end()-1 );  // 左闭右开
 cout << "second size: " << second.size() << endl;  // 8
 for ( int nPos = 0; nPos < second.size(); nPos ++ )
  cout << second[nPos] << endl;

 int array[3] = {1, 2, 3};
 vector<int> third;
 third.assign( array, array+sizeof(array)/sizeof array[0] );
 cout << "third size: " << third.size() << endl; // 3
 for ( int nPos = 0; nPos < third.size(); nPos ++ )
  cout << third[nPos] << endl;


{
 vector<int> first( 3, 0 );
 vector<int> second( 5, 0 );
 cout << second.size() << endl; // 5

 second = first; // 拷贝之前,second先被销毁
 cout << second.size() << endl; // 3

原创粉丝点击