2012年12月6日

vector中v[i]与v.at(i)的区别

摘要: void f(vector<int> &v){ v[0]; // A v.at[0]; // B}如果v非空,A行和B行没有任何区别。如果v为空,B行会抛出std::out_of_range异常,A行的行为未定义。c++标准不要求vector<T>::operator[]进行下标越界检查,原因是为了效率,总是强制下标越界检查会增加程序的性能开销。设计vector是用来代替内置数组的,所以效率问题也应该考虑。不过使用operator[]就要自己承担越界风险了。如果需要下标越界检查,请使用at。 阅读全文

posted @ 2012-12-06 18:15 zhuyf87 阅读(13270) 评论(0) 推荐(1) 编辑

使用“swap技巧”除去多余的容量

摘要: 为了避免vector占用不再需要的内存,需要有一种方法把它的容量(capacity)缩减到当前需要的数量。方法就是:vector<ElemType>(v).swap(v);。vector<ElemType>(v)创建一个临时变量,它是v的一个拷贝。vector的拷贝构造函数只为所拷贝的元素分配所需要的内存,所以这个临时变量不会有多余的容量。然后将这个临时变量与v做swap操作,在这之后v就具有了被去除之后的容量,即原先临时变量的容量。临时变量会具有原先v的容量,随后临时变量被析构,从而释放内存。测试程序及输出(vc2008):vector<int> v;v. 阅读全文

posted @ 2012-12-06 16:40 zhuyf87 阅读(677) 评论(0) 推荐(0) 编辑

如何把vector和string数据传递给旧的api

摘要: 如果决定使用vector和string代替传统的数组,就要考虑如何与旧的C API和平共处。如果有一个vector v,同时需要一个指向v中数据的指针,从而把v中的数据当做数组来对待。可以使用&v[0]来得到这样的指针,&v[0]会指向v中的第一个元素,并且c++标准要求vector中的元素存储在连续的内存中,就像数组一样。void do_something(const int * ints, size_t num_ints);if (!v.empty()) do_something(&v[0], v.size());不要使用v.begin()来代替&v[0], 阅读全文

posted @ 2012-12-06 14:26 zhuyf87 阅读(701) 评论(0) 推荐(0) 编辑

使用reserve函数避免vector和string的内存重新分配

摘要: vector和string内部维护的内存会“自动增长”,以便容纳不断放入其中的元素。调用max_size()可以返回其容量的最大限制。“自动增长”的过程如下:(1)分配一块大小为当前容量的某个倍数的新内存。(2)将元素从旧内存拷贝到新内存。(3)析构旧内存中的对象。(4)释放旧内存。“自动增长”的过程很耗时,并且会导致所有的指针、迭代器和引用失效。所以避免频繁的内存重新分配就显得很重要。使用成员函数reserve()可以避免因“自动增长”而造成的内存重新分配。要尽早的使用reserve,把容量设为足够大。最好在容器刚被构造出来之后就使用reserve。vector<int> v;v 阅读全文

posted @ 2012-12-06 10:28 zhuyf87 阅读(613) 评论(0) 推荐(1) 编辑

导航