成 都 外 围 - 成 都 哪 有 外 围

  成 都 外 围 - 成 都 哪 有 外 围 -薇芯【81343628】【81343628】【高端外围资源】【诚信合作,非诚勿扰!】可直接添加 !vector就是动态数组.它也是在堆中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放.如果新值>当前大小时才会再分配内存.
  它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。
  对最后元素操作最快(在后面添加删除最快 ), 此时一般不需要移动内存,只有保留内存不够时才需要
  成 都 外 围 - 成 都 哪 有 外 围 -薇芯【81343628】【81343628】【高端外围资源】【诚信合作,非诚勿扰!】可直接添加 !对中间和开始处进行添加删除元素操作需要移动内存,如果你的元素是结构或是类,那么移动的同时还会进行构造和析构操作,所以性能不高 (最好将结构或类的指针放入vector中,而不是结构或类本身,这样可以避免移动时的构造与析构)。
  访问方面,对任何元素的访问都是O(1),也就是是常数的,所以vector常用来保存需要经常进行随机访问的内容,并且不需要经常对中间元素进行添加删除操作.
  相比较可以看到vector的属性与string差不多,同样可以使用capacity看当前保留的内存,使用swap来减少它使用的内存.
  capacity()返回vector所能容纳的元素数量
  例如下面的代码
  #include <iostream>
  #include <vector>
  using namespace std;
  class A{
  char *p;
  public: A();
  ~A();
  };
  template<typename T>
  int traverse(vector<T> vecData){
  typename vector<T>::iterator it;
  int i=0;
  //for(T::size_type i=0;it!=vecData.end();it++,i++)
  for (it = vecData.begin(); it != vecData.end(); ++it)
  cout<<"\t"<<i<<"\t"<<*it<<endl;
  }
  A::A(){p=(char *)malloc(sizeof(char) * 1024);}
  A::~A(){free(p);}
  int f();
  int main(){f();}
  int f(){
  A o;
  vector<string> vecData;
  vector<char*> vecPtr;
  char *a=(char *)malloc(sizeof(char) * 1024);
  a[0]=‘o‘;
  a[1]=‘k‘;
  a[3]=‘\0‘;
  string data="1234";
  vecData.push_back(data);
  cout<<"vecData[0]\t"<<vecData[0]<<"\tcapacity:\t"<<vecData.capacity()<<endl;
  data.clear();
  data="4321";
  vecData.push_back(data);
  cout<<"vecData[1]\t"<<vecData[1]<<"\tcapacity:\t"<<vecData.capacity()<<endl;
  data.clear();
  std::sort(vecData.begin(),vecData.end());
  traverse(vecData);
  vecPtr.push_back(a);
  cout<<"before ptr vector release"<<endl;
  traverse(vecPtr);
  free(a);
  a=NULL;
  cout<<"after ptr vector release"<<endl;
  traverse(vecPtr);
  }
  此时运行valgrind:
  (1)不会出现vecData内存未释放的情况,说明vector对象析构函数在退出的时候自动进行了调用;
  (2)不会出现因为删除掉data就导致读不到vector中内容的情况,说明在push_back增加元素的时候进行了拷贝操作,即使是原有数据删除也不会影响;
  (3)成 都 外 围 - 成 都 哪 有 外 围 -薇芯【81343628】【81343628】【高端外围资源】【诚信合作,非诚勿扰!】可直接添加 !当vector中的元素为指针的时候,拷贝的是指针本身,而不是指针指向的对象,此时释放掉指针对象的空间,那么vector中的元素就找不到地址,用valgrind会告诉说访问已经free的内存,但是不会出现内存泄露;
  ==14367== Invalid read of size 1
  ==14367== at 0x3B7726CF1A: _IO_file_xsputn@@GLIBC_2.2.5 (in /lib64/libc-2.5.so)
  ==14367== by 0x3B7726234A: fwrite (in /lib64/libc-2.5.so)
  ==14367== by 0x3E95690310: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib64/libstdc++.so.6.0.8)
  ==14367== by 0x403D9D: int traverse<char*>(std::vector<char*, std::allocator<char*> >) (testVector.cpp:33)
  ==14367== by 0x4013FA: f() (testVector.cpp:64)
  ==14367== by 0x4014FA: main (testVector.cpp:38)
  ==14367== Address 0x4e24481 is 1 bytes inside a block of size 1,024 free‘d
  ==14367== at 0x4A05D21: free (vg_replace_malloc.c:325)
  ==14367== by 0x401374: f() (testVector.cpp:60)
  ==14367== by 0x4014FA: main (testVector.cpp:38)
  ==14367==
  0 ok
  ==14367==
  ==14367== HEAP SUMMARY:
  ==14367== in use at exit: 0 bytes in 0 blocks
  ==14367== total heap usage: 12 allocs, 13 frees, 2,220 bytes allocated
  ==14367==
  ==14367== All heap blocks were freed -- no leaks are possible
  ==14367==
  ==14367== For counts of detected and suppressed errors, rerun with: -v
  ==14367== Use --track-origins=yes to see where uninitialised values come from
  ==14367== ERROR SUMMARY: 9 errors from 8 contexts (suppressed: 4 from 4)

猜你喜欢

转载自www.cnblogs.com/wwyyff80/p/12784080.html