你必须知道的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中文版