首页 > 其他分享 >std::string::resize() 对缓冲区一些用处

std::string::resize() 对缓冲区一些用处

时间:2023-01-21 06:55:05浏览次数:55  
标签:std string strString 缓冲区 NULL resize

如果需要一个缓冲区来暂存字符串会先定义一个char*的数组来实现

存完后又给string赋值,感觉有点麻烦,寻思有什么方法可以更优雅点

比如如下代码

 1 void CVTString::StrToWStr(std::string& strString, std::wstring& wsString, unsigned int uCodePage)
 2 {
 3     int len = 0;
 4     wchar_t* buffer = nullptr;
 5 
 6     len = MultiByteToWideChar(uCodePage, NULL, strString.c_str(), static_cast<int>(strString.size()), NULL, NULL);
 7     buffer = new wchar_t[len + 1];
 8     MultiByteToWideChar(uCodePage, NULL, strString.c_str(), static_cast<int>(strString.size()), buffer, len);
 9     buffer[len] = L'\0';
10     wsString = buffer;
11 
12     delete[] buffer;
13 }

这个new可不可以去掉呢?这样的话buffer指针和delete也可以去掉了,性能应该有一丢丢提升

 

std::string有一个resize方法可以改变string分配的缓冲区大小

同时配合data方法来获取缓冲区的指针,这样可以实现一个char*数组效果的缓冲区。

 

但是注意的是string内部默认是分配了一个较小的缓冲区,如果resize的大小比较小

data方法的指针仍然不变,但是如果resize比较大,data返回的指针会变化

也就是会释放旧缓冲区,重新分配缓冲区。

这个大小的界限在vc上是16,也就是大于等于16的resize会重新分配缓冲区。

同时也就提醒我们,不要认为data和c_str返回的地址总是不变的。

如果是resize小于当前字符串长度,会直接截断字符串,也就是在目标长度的缓冲区补0,暂时没发现会进行重新分配。

 

resize还有一点,resize的长度默认是不包含字符串结束符号 \0 的,也就是resize(5),实际上会分配6的空间,最后一个字节补0

对于wstring则是补充\0\0

resize的第二个参数是填写补充的字符,resize(10,'x'),如果比原始字符串长,则会补充x字符,往小resize不会,而且依然会在最后补充结束符。

 

最终优化的代码

 1 void CVTString::StrToWStr(std::string& strString, std::wstring& wsString, unsigned int uCodePage)
 2 {
 3     int charCount = MultiByteToWideChar
 4     (
 5         uCodePage, NULL, strString.c_str(), static_cast<int>(strString.size()), NULL, NULL
 6     );
 7 
 8     if (charCount == 0) return;
 9 
10     wsString.resize(charCount);
11     MultiByteToWideChar
12     (
13         uCodePage, NULL, strString.c_str(), static_cast<int>(strString.size()), const_cast<wchar_t*>(wsString.data()), charCount
14     );
15 }

 

标签:std,string,strString,缓冲区,NULL,resize
From: https://www.cnblogs.com/Dir-A/p/17063480.html

相关文章

  • string的一些知识
    sizeof(string)为32因为本质上string属于类,类中的成员是char,类的大小就是类中成员变量(非静态)加上指向虚函数表的指针以及指向虚基类表的指针加起来的和。这里string类只有......
  • 23/1/119-LeetCode 08:String to Integer (atoi)
    思路主要是对于前面的零,可以不用再去特殊判断了嘛。直接当成普通的数字直接算就好,反正算完之后ans=0,nodifference;对于超出范围,这个一直都是我不太注意的地方,这里max=2^......
  • C++获取含有中文字符的string长度
    :前言造车轮的时候要用到中文字符串的长度辨别,发现char的识别不准,进行了一番研究。>开始研究在Windows下,中文字符在C++中的内存占用为2字节,此时采用字符串长度获取函......
  • string 接收 char 随机数abcd
    packagecom.fqs.demo;importjava.util.Random;publicclassCharAB{//输出26个小写字母和26个大写字母publicstaticvoidmain(String[]args){......
  • C++ 中标准库类型 string
    标准库类型string表示可变的字符序列,使用string类型必须首先包含string头文件。string本质上是一个类,是STL提供的char*的容器。定义初始化string对象初......
  • ABC 285 F - Substring of Sorted String
    好久都没写线段树的题解了……水一发题意:给定一个字符串,满足两种操作。第一种为修改串上某个地方的字母,第二种为查询一个区间,并判断当整个字符串按照升序排序后这一段区......
  • java:日期工具类,是否是闰年,获取当前日期的前后一天,月,年,获得日期的年月日时分秒,string与
    java:日期工具类,获取当前日期的前后一天,月,年,获得日期的年月日时分秒,string与date之间转换。这里写目录标题​​java:日期工具类,获取当前日期的前后一天,月,年,获得日期的年月日时......
  • StringBuilder类
    StringBuilder类/*StringBuilder是一个可变的字符串类,我们可以把它看作一个容器,可变是指它对象中的内容是可变的.String中的内容是不可变的.StringBuilder中的......
  • 使用StringBuilder拼接字符串
    使用StringBuilder拼接字符串/*StringBuilder比String来拼接字符串效率高!@#$需求:定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在......
  • 使用StringBuilder反转字符串
    使用StringBuilder反转字符串importjava.util.Scanner;/*需求:定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果例如,键盘录入abc,输出结......