你必须知道的vector

1.下面的代码,A和B有何区别

void f(vector<int>&v)
{
v[
0]=1; //A
v.at(0)=1;//B
} 

    如果V非空,A和B结果一样.如果V为空,B会抛出一个Std::out_of_range异常,A的行为为未定义.为了保证vector和内置数组一样的高效,operator[]不做越界检查.如果你需要下标越界检查,请使用at()成员函数.

2.如下代码,请从风格和正确性方面对对其作出评价

    vector<int>v;    
v.reserve(
2);
assert(v.capacity()
==2);
v[
0]=1;
v[
1]=2;
for (vector<int>::iterator it=v.begin(); it<v.end();it++)
{
cout
<<*it<<endl;
}
 

  1.assert(v.capacity()==2); 

      vector容器的容量是指数增长的.当你指定了一个容量值并调用reserve这个函数时,此时容器的容量应该>=你指定的值.所以v.capacity()==2形式可能会使断言失败.应该是v.capacity()>=2

  2.v[0]=1;v[1]=2; 

     此时容器的容量是>=2,size为0. []只能对已经存在的元素操作,而容器中此时没有任何元素,所以上面是错误的.此时,按照程序的意图应该是 v.push_back(YouNum)

  3.循环部分

     (1)迭代器最好用const_iterator

     (2)尽量用!=而不是<来比较两个迭代器,因为迭代器不一定是随机迭代器支持<

     (3)尽量用前置++,--,减少临时变量

     (4)可以使用"\n"代替endl.因为没必要每次刷新缓冲区,可以让程序快点

     (5)尽量使用标准库函数代替手写循环,本例中可以使用copy(for_each需要彷函数):copy(v.begin(),v.end(),ostream_iterator(cout,"\n"))

参考: Exceptional c++ style中文版

转载于:https://www.cnblogs.com/LoveLyre/archive/2011/09/13/2174819.html

猜你喜欢

转载自blog.csdn.net/weixin_33866037/article/details/92840840