vector的使用

82 篇文章 0 订阅

//《C++编程剖析》读书笔记


//----------------------------------------------------------------

vector<T>::at(i)  会进行下标越界检查

vector<T>::operator 不强制进行越界检查


//----------------------------------------------------------------

大小size,跟resize相对应;

容量capacity,与reserve相对应;二者有很大的区别


1)size告诉你容器中目前实际有多少个元素,而对应的,resize则会在容器的尾部添加或删除一些元素,来调整容器当中实际的内容,使容器达到指定大小。这两个函数对list  vector deque都适用,但对其他容器不适用。

2)capacity则告诉你最少添加多少个元素才会导致容器重新分配内存,而reserve在必要的时候总是会使容器的内部缓冲区扩充至一个更大的容量,以确保至少能满足你所指出的空间大小,这两个函数仅对vector适用。v.reserve(10);并没有存储元素。


//-----------------------------------------------------------------

//for(vector<int>::iterator i=v.begin();i<v.end();i++)

//  cout<<*i<<endl;

1)尽量做到const正确性。

       以上循环当中,迭代器并没有用来修改vector中的元素,因此应当改用const_iterator


2)尽量使用 != 而不是使用 < 来比较两个迭代器。

       确实,由于vector<int>::iterator恰巧是一个随机访问迭代器,因此在这种特定情况下将它跟v.end()比较是没有任何问题的。但问题是, <  只对随机访问迭代器有效,而 != 对于任何迭代器都是有效的,因此我们应该将使用 != 比较迭代器作为日常惯例。使用 !=还有一个好处,就是便于将来需要时更改容器类型。


3)尽量使用前缀形式的--和++。

      让自己习惯于写++i而不是i++,除非真的需要用到i的原来的值。

     (两者的根本区别:

      根本区别是语义上的区别,一个返回+之后的值一个返回+之前的值。如果没有用到返回值的话,区别在于效率。

  • 若i是内置的数值类型,两者完全一样
  • 若i是一些自定义的类,如iterator,++i的效率 > = i++的效率
     对于后者推荐都用++i;对于前者,用哪个是程序风格问题,i++的好处是更符合人类思维习惯,++i的好处是每次都用这种形式就不用考虑i的类型。

i++ 返回原来的值,++i 返回加1后的值。
i++ 不能作为左值,而++i 可以。)

4)避免无谓的重复求值
本例中v.end()所返回的值在整个循环过程中是不会改变的,因此应当避免在每次判断循环条件时都调用一次v.end();或许我们应当在循环之前预先将v.end()求出来。(基本类型时,编译器也许能将v.end()进行内联及合理优化)

5)尽量使用\n,而不是endl
使用endl会迫使输出流刷新其内部缓冲区。如果该流的确有内部缓冲区,而且又确实不需要每次都刷新它的话,可以在整个循环结束之后写一行刷新语句,这样程序会执行得快很多。

6) 尽量使用标准库中的copy()和for_each(),而不是自己手写循环,因为利用标准库的设施,你的代码可以变得更为干净简洁。
copy( v.begin(),v.end(),ostream_iterator<int>(cout,"\t") );
cout<<endl;
---------------------------------------------------------------------------
总之,
确保const正确性。特别是不对容器内的元素做任何改动的时候,记得使用const_iterator。
尽量使用 !=而不是 <来比较两个迭代器
养成默认情况下使用前缀形式的--和++的习惯,除非你的确需要用到原来的值。
实施复用:尽量复用已有的算法,特别是标准库算法 (例如for_each()),而不是手写的循环。

      

  



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值