目录
使用这两种容器优于自己动态分配的数据
使用reserve避免不必要的重新分配
如何把vector和string的数据传给C API
避免使用vector
本章讲解 vector 和 string 在使用的注意问题。
使用这两种容器优于自己动态分配的数据
如果多线程使用引用计数的string,则应该为了支持线程安全而导致的性能问题。如果所使用的string以“引用计数”方式实现,同时又运行在多线程环境中,并因此影响了程序效率。
std::string test1 = "addddddddddddddddddddddddddddd";
std::string test2 = test1 ;
printf("%p:%dn", &test1.c_str()[0], test1.capacity()); //0x2216188:30
printf("%p:%dn", &test2.c_str()[0], test2.capacity()); //0x2216188:30
test2 = "ee";
printf("%p:%dn", &test2.c_str()[0], test2.capacity()); //0x22161c8:2 写时创建
我的gcc_4.8.5 的版本的测试结果,前面两个打印的地址是一样的,说明并没有创建新的内存,只有在修改时才重新分配了内存(看第三行打印)。
考虑以下三种选择:
- 是否可以通过改变某个预处理变量禁用引用计数。
- 寻找另外一个不使用“引用计数”实现的string。
- 使用vector
代替string,vector不允许使用引用计数,所以不会有多线程性能问题。当然这样的话就舍弃了string的成员函数的机会,但是大多数函数的功能可以通过STL算法来实现。
使用reserve避免不必要的重新分配
当一个元素需要插入容器,而容量不够时,就会发生重新分配过程(申请空间,拷贝对象,析构原容器中的对象,释放原容器内存)这是一个很耗时的操作。通常用reserve避免不必要的重新分配
reserve(size_type new_cap);强迫容器把它的容量变为至少为new_cap。
vector:若new_cap大于当前的capacity(),则分配新存储,否则该方法不做任何事。
string:若new_cap大于当前的capacity(),则分配新存储,否则强制收缩到max(size(),new_cap)和(C++20前)或者不做任何事(C++20)。
如何把vector和string的数据传给C API
vector是连续内存:使用&V[0]或者&*V.begin();先要先判断V中是否为空。
string:上面的方式对string是不可靠的;因为string中的数据不一定是连续的,同时内部表示不一定是以空字符结尾的。应该使用c_str()。
避免使用vector
它并不真正存储bool,为了节省空间,每个元素只占一个二进制位。一个8位的字节可以容纳8个元素。因为bool*p=&V[1],并不是取的第2个字节的地址,这样不能百编译。
可以使用deque,是容器,同时里面存储的是bool。
或者bitset,也是按位存的,但不是STL容器,但是标准C++库一部分
凡是过往,即为序章
它并不真正存储bool,为了节省空间,每个元素只占一个二进制位。一个8位的字节可以容纳8个元素。因为bool*p=&V[1],并不是取的第2个字节的地址,这样不能百编译。
可以使用deque
或者bitset,也是按位存的,但不是STL容器,但是标准C++库一部分
凡是过往,即为序章



