vector<int> v;
1. v[i]不进行越界检查,v.at(i)进行边界检查。
2. reserve和capability相对,是关于vector的容量
v.reserve(i);
v.capability()至少为i。
reserve操作不改变vector中的内容。通常,如果知道要向容器中放入的元素数目,可先调用reserve以避免不必要的重新内存分配。
3. size和resize相对
size()返回容器中实际元素的个数;
resize会在容器的尾部添加和删除一些元素(添加通过默认构造函数),来调整容器中的实际内容。
4. 在不修改元素时,使用const_iterator
5. 循环时使用,!= 判断是否达到容器尾部
6. 尽量使用前缀形式的--或++
for(vector<int>::const_iterator i = v.begin(); i < v.end(); ++i)
cout<<(*i)<<"/n"; //endl会迫使输出流刷新其内部缓冲区,降低效率
7. 使用标准库
copy( v.begin(), v.end(), ostream_iterator<int>(cout, "/n") );
8. 避免使用vector<bool>
bool *pb = &vec_bool[0];
编译不能通过,因为vector<bool>内部是通bit来表示bool,v[0]的返回值是一个代理对象,
vector<bool>::reference *pb = &vec_bool[0];
如果需要存储bool类型,可以用deque<bool>,它里面存储的是真正的bool类型;而且deque的接口与vector基本完全一致,除了reserve和capacity。当然deque中的内存是不连续的,不给传给C API。
如果要存储bit类型,可以用bitset。与STL容器不同,它的大小在编译时就确定了,所以不能插入和删除元素。
bitset<1000> bs;
bs[5] = 1;
cout<<bs.to_ulong()<<"/n";
1. v[i]不进行越界检查,v.at(i)进行边界检查。
2. reserve和capability相对,是关于vector的容量
v.reserve(i);
v.capability()至少为i。
reserve操作不改变vector中的内容。通常,如果知道要向容器中放入的元素数目,可先调用reserve以避免不必要的重新内存分配。
3. size和resize相对
size()返回容器中实际元素的个数;
resize会在容器的尾部添加和删除一些元素(添加通过默认构造函数),来调整容器中的实际内容。
4. 在不修改元素时,使用const_iterator
5. 循环时使用,!= 判断是否达到容器尾部
6. 尽量使用前缀形式的--或++
for(vector<int>::const_iterator i = v.begin(); i < v.end(); ++i)
cout<<(*i)<<"/n"; //endl会迫使输出流刷新其内部缓冲区,降低效率
7. 使用标准库
copy( v.begin(), v.end(), ostream_iterator<int>(cout, "/n") );
8. 避免使用vector<bool>
bool *pb = &vec_bool[0];
编译不能通过,因为vector<bool>内部是通bit来表示bool,v[0]的返回值是一个代理对象,
vector<bool>::reference *pb = &vec_bool[0];
如果需要存储bool类型,可以用deque<bool>,它里面存储的是真正的bool类型;而且deque的接口与vector基本完全一致,除了reserve和capacity。当然deque中的内存是不连续的,不给传给C API。
如果要存储bit类型,可以用bitset。与STL容器不同,它的大小在编译时就确定了,所以不能插入和删除元素。
bitset<1000> bs;
bs[5] = 1;
cout<<bs.to_ulong()<<"/n";