string 类记录
Posted lwp-boy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了string 类记录相关的知识,希望对你有一定的参考价值。
空间分配方式:
string 在构建实例时默认分配8字节空间(和g++编译环境有关,一般是8字节),在后面的数据操作时,当字节长度超过当前分配空间时,会以2倍的空间重新分配一块新的内存,该分配策略和vector相似,当前内存后边有足够的空间,就在当前内存后追加内存,如果不够就重新分配一块大的内存,把当前的字符串拷贝到新内存块中,释放原来的内存块。
使用注意点:
- 当进行频繁的字符串操作时,string对性能影响很大,避免采用过多的string零时变量,将会导致大量的对象创建和释放。
- 初始化字符串时,预估一个大小,避免string频繁的内存重建,导致性能的损耗。
- 字符串拼接尽量采用 +=的模式,它的性能是拼接字符串中性能最好的。
- 函数参数尽量使用字符串的引用传参,如果是不可修改可设置为:const string& 该处可以直接向接口传字符串,而string& 需要传入一个string的实例。
内存数据与二进制字符串互相转化
#include <iostream> #include <string> using namespace std; //内存数据转二进制字符串 string buf2bit(void* addr, size_t size) { char *paddr = (char*)addr; string str = ""; for(int i = 0; i < size; i++) { bitset<8> b(*paddr); str += b.to_string(); paddr++; } return str; } //二进制字符串转内存数据 void bit2buf(void* addr, const string& str) { char *paddr = (char*)addr; for(int i = 0; i < str.size(); i+=8) { bitset<8> bit(str.substr(i, 8)); char b = (char)bit.to_ulong(); memcpy(paddr, &b, sizeof(char)); paddr++; } } //根据二进制字符串获取内存数据大小 int getSizeByBit(const string& str) { return str.size()/8; }
内存数据与16进制进制字符串互相转化
#include <string.h> #include <string> #include <sstream> #include <iomanip> using namespace std; //内存数据转16进制字符串 string buf2hex(void* addr, size_t size) { char *paddr = (char*)addr; string str; stringstream stream; for(int i = 0; i < size; i++) { int n = (int)*paddr; n &= 0xff; stream<<setfill(‘0‘)<<setw(2)<<hex<<n; paddr++; } stream>>str; return str; } //16进制字符串转内存数据 void hex2buf(void* addr, const string& str) { char *paddr = (char*)addr; for(int i = 0; i < str.size(); i+=2) { char b = (char)strtol(str.substr(i,2).c_str(),NULL, 16); memcpy(paddr, &b, sizeof(char)); paddr++; } } //根据16进制字符串获取内存数据大小 int getSizeByHex(const string& str) { return str.size()/2; }
数字字符串到数字的相互转换
#include <string.h> #include <string> #include <sstream> using namespace std; //数字转字符串 template<typename T> string digit2string(const T& t) { static stringstream ss; ss.clear(); ss<<t; //double 转换到string后,精度只有6位,和float相同 return ss.str(); } template<> string digit2string<double>(const double& t) { char buf[128] = {‘