string 类记录

Posted lwp-boy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了string 类记录相关的知识,希望对你有一定的参考价值。

空间分配方式:

  string 在构建实例时默认分配8字节空间(和g++编译环境有关,一般是8字节),在后面的数据操作时,当字节长度超过当前分配空间时,会以2倍的空间重新分配一块新的内存,该分配策略和vector相似,当前内存后边有足够的空间,就在当前内存后追加内存,如果不够就重新分配一块大的内存,把当前的字符串拷贝到新内存块中,释放原来的内存块。

使用注意点:

  1. 当进行频繁的字符串操作时,string对性能影响很大,避免采用过多的string零时变量,将会导致大量的对象创建和释放。
  2. 初始化字符串时,预估一个大小,避免string频繁的内存重建,导致性能的损耗。
  3. 字符串拼接尽量采用 +=的模式,它的性能是拼接字符串中性能最好的。
  4. 函数参数尽量使用字符串的引用传参,如果是不可修改可设置为: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] = {};
    sprintf(buf, "%.15g", t);
    return string(buf);
}

//字符串转数字
template<typename T>
T string2digit(const string& str)
{
    static stringstream ss;
    T t;
    ss.clear();
    ss<<str;
    ss>>t;
    return t;
}

合并多个空格到一个空格

#include <string>
#include <algorithm>

using namespace std;

struct AreBothSpaces
{
    bool operator () (char c1, char c2)
    {
        return c1 ==   && c2 ==  ;
    }
};

//采用std::unique实现字符串多个空格合并到一个空格的方式 
void mergeSpaces(string& str)
{
    string::iterator it = unique(str.begin(), str.end(), AreBothSpaces());
    str.erase(it, str.end());
}

 

以上是关于string 类记录的主要内容,如果未能解决你的问题,请参考以下文章

记录C#常用的代码片段

discuz X3.1 源代码阅读,记录代码片段

如何在片段类而不是活动类中使用底页?

提效小技巧——记录那些不常用的代码片段

如何通过单击片段内的线性布局从片段类开始新活动?下面是我的代码,但这不起作用

用于从 cloudkit 检索单列的代码模式/片段