vector效率低怎么破?

大部分C++开发者,使用vector完全替代了数组。

但有时候,vector浪费了很多的时间,即效率低下。

譬如说:
vector不会自动decrease,即使调用了clear()方法。这个时候,我们可以使用swap方法,还好c++11为我们提供了shrink_to_fit方法。
之前也有介绍过,看这里《正确释放vector内存》http://blog.csdn.net/wangshubo1989/article/details/50359750

其实,我们遇到更多的问题是,vector的构造方式太多,很多时候,是这个原因导致的效率低下。

先热身一下,写一个new数组:

int * big_array = new int[N];
for (unsigned int k = 0; k < N; k++)
{
  big_array[k] = k;
}
int sum = total(big_array, N);
delete [ ]big_array;
return sum;

用vector重写:

vetor<int> big_array(N);
for (unsigned int k = 0; k < N; k++)
{
  big_array[k] = k;
}
int sum = total(big_array, N);
return sum;

这里就明确了,上面的vector代码效率不是很高,因为先是构造一个size为N的big_array,然后把N个元素初始化为0,又对N个元素进行了重新赋值。

那你可以说,如果我不传N呢,不指定vector的大小,vector不是动态的吗?

vetor<int> big_array;
for (unsigned int k = 0; k < N; k++)
{
  big_array.push_back(k);
}
int sum = total(big_array, N);
return sum;

如果你了解vector是怎么分配内存的,你就不会写出上面的代码,因为效率实在低下。
一言以蔽之:vector内存不够用的时候,分配二倍的空间,然后把之前的copy到新的空间中。

那如果我们大概知道vector的大小,就可以提前分配了:

vetor<int> big_array;
big_array.reserve(N);
for (unsigned int k = 0; k < N; k++)
{
  big_array.push_back(k);
}
int sum = total(big_array, N);
return sum;

这里有个提示:
别混淆了resize和reserve :
http://blog.csdn.net/wangshubo1989/article/details/50322489

有的时候,可以使用emplace_back代替push_back:
http://blog.csdn.net/wangshubo1989/article/details/50357549

vector效率低怎么破?_第1张图片

你可能感兴趣的:(C++)