//《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 可以。)