Zero Lee的专栏

关于vector的使用

Item1: vector的使用
JG问题
void f(vector<int>& v) {
   v[0] = 1;   // A
   v[1] = 2;   // B
}
GURU问题:

 1 vector < int >  v;
 2 v.reserve( 2
);
 3 assert(v.capacity()  ==   2
);
 4 v[ 0 =   1
;
 5 v[ 1 =   2
;
 6 for  (vector < int > ::iterator i  =
 v.begin(); 
 7        i  <  v.end(); i ++
{
 8     cout  <<   * <<
 endl;
 9 }

10 cout  <<  v[ 0 ];
11 v.reserve( 100
);
12 assert(v.capacity()  ==   100
);
13 cout  <<  v[ 0
];
14 v[ 2 =    3
;
15 v[ 3 =   4
;
16 //  ...

17 v[ 99 =   100 ;
18 for  (vector < int > ::iterator i  =
 v.begin();
19        i  <  v.end(); i ++
{
20     cout  <<   * <<
 endl;
21 }
对于以上两个问题,可能存在如下的建议:
1) JG问题中B与A的区别
   如果V非空,则A与B无任何区别,如果V为空,则B行将一定会抛出一个std::out_of_range异常,至于A的行为,标准并未加任何说明。
   原因在于:at()成员函数会对其进行越界检查,而operator[]操作符则不会,秉承于数组[]下标运算符也不会检查越界一样。

2) GURU问题
代码:
1 vector < int >  v;
2 v.reserve( 2
);
3 assert(v.capacity()  ==   2
);
4
 1> 断言可能会失败。reserve()函数的调用会保证v的容量至少为2,也可能大于2,而且容量是呈指数速度上升的。应该改为assert(v.capacity() >= 2);
 2> 但是改进后的断言显的有点多余。因为标准已保证断言的内容,写上只会带来不必要的混乱,除非不相信标准。
代码:
1 v[ 0 =   1 ;
2 v[ 1 =   2
;
3
  size ——>resize, capacity ——> reserve
1> size告诉你容器中目前实际有多少元素,而对应的resize会在容器的尾部添加或删除一些元素,来调整容器当中的实际内容,使容器达到指定大小。对list、deque和vector适用,其他容器则不适用;
2> capacity则告诉你最少添加多少元素才会导致容器重分配内存。而reserve在必要时总是使容器的内存缓冲区扩至一个更大的容量。仅对vector有用。
3> 但我们实际上并未向v中添加任何元素,v仍然为空!我们只能使用at()或[]去改变那些确实存在于容器中的元素,与容器大小息息相关的。
因此v[0] = 1; v[1] = 2;在某些情况下会“顺利”执行,建议最好不要如此使用,可以使用resize()函数来替代reserve()函数。

代码:
1 for  (vector < int > ::iterator i  =  v.begin(); 
2        i  <  v.end(); i ++
{
3     cout  <<   * <<
 endl;
4 }

5

以上代码有诸如以下的建议:
1> 尽量使用const.未修改v中的内容,可使用const_iterator;
2> 尽量使用!=而不用<来比较迭代器。 != 对任何迭代器都有效,而< 只对随机访问迭代器有效。list不支持<;
3> 尽量使用++前缀,而非后缀。可以从++前后缀的实现代码中得知,除非一些特殊场合;
4> 避免无谓的重复求值。v.end()函数在重复求值,而整个循环期间都未改变。除非end()被编译器进行内联,无调用开销,最好是将其提到循环外面;
5> 尽量使用'\n'而非endl。原因在于endl会迫使输出流刷新其内部缓冲区,可以在整个循环之后写一个刷新语句。
6> 尽量使用标准库中算法. 如copy()、for_each()。例如这里就可以这样写:
copy(v.begin(), v.end(), ostream_iterator<int>(cout, '\n'));
这样一来也避免了1> ~ 5的麻烦。

// zero

posted on 2006-10-14 15:05 Zero Lee 阅读(3222) 评论(0)  编辑 收藏 引用 所属分类: C++ Performance


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理