栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

STL 使用问题(四)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

STL 使用问题(四)

目录

使用这两种容器优于自己动态分配的数据

 使用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 的版本的测试结果,前面两个打印的地址是一样的,说明并没有创建新的内存,只有在修改时才重新分配了内存(看第三行打印)。

考虑以下三种选择:

  1. 是否可以通过改变某个预处理变量禁用引用计数。
  2. 寻找另外一个不使用“引用计数”实现的string。
  3. 使用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++库一部分


凡是过往,即为序章

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/722548.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号