C++手稿:std::string

字符串在非常多编程语言中已经成为基本数据类型,C语言中我们使用char*来手动申请和维护字符串,
在C++中,能够使用std::string来方便地创建和操作字符串。

string是一个模板类。它有basic_string<T>定义:

typedef basic_string<char> string;

C++的string能够通过成员方法c_str()转换为C语言的char*

參考文档:cplusplus.com/string

初始化与赋值

string有两个经常使用的构造函数:

// 用一个C字符串构造
string str("hello");
// 等价于
string str = "hello";

也能够用N个相同的字符来构造字符串:string
str2(8, ‘x‘)

在C0x标准中,std::to_string能够将非常多类型转换为一个string,能够取代itoa,比如:

string str = to_string(123);

string构造函数不接受charint类型。

字符串能够直接互相赋值,内存会自己主动拷贝和销毁。我们大可不必管它。对于单个字符赋值能够使用下标运算符:

for(int i=0;i<str.length(); i++){
    str[i] = ‘a‘;
}

与多数class类似。string也提供了swapstr1.swap(s2)将会交换二者的值。

运算符支持

有通用运算符支持的数据类型往往更easy理解和操作,当中最讨人喜欢的莫过于+运算符:

str += str2;
str = str + "hello";

当然,你也能够直接调用append方法:str.append(str2)

除了+string还支持一系列的比較运算符:<==><=>=!=

当然,你仍然能够直接调用compare方法:str1.compare(str2)str1小则会返回-1

长度

  • 字符串为空

    • empty():返回是否为空。
    • clear():清空字符串。

  • 字符串长度
    • length():等效于size()。返回字符串长度。
    • resize(10,
      ‘x‘)
      :改变长度。假设超过了原有长度,后面补x,第二个參数默认值为null。

  • 字符串内存
    • capacity():无需再次申请内存可存放的字符数。
    • reserve(10):申请10字符的内存。通常在大量的insert前先reserve一下。避免多次申请内存。

查找

  • str.find("ll"):字符串llstr中第一次出现的下标,未找到为string::npos
  • str.rfind("ll"):同上,从右向左查找。
  • str.find("ll",
    3)
    :从下标3開始查找。

改动

  • erase(5):去掉下标5開始的全部字符。
  • replace(2,
    3, "ll")
    :下标2開始的3个字符换成"ll"
  • insert(2,
    "ll")
    :下标2处插入"ll"

流处理

在C++中。标准输入输出、文件、字符串都能够作为一个流,来接受输入或者输出。 在C++中字符串流也是格式化输出的一种经常使用手段。

string input("test 123");
istringstream sinput(input);

string str;
int i;
sinput >> str >> i;

ostringstream soutput;
soutput << str << i;
cout<< soutput.str();
// test123


除非注明,本博客文章均为原创,转载请以链接形式标明本文地址: http://harttle.com/2015/06/30/std-string.html

时间: 2024-11-01 11:47:23

C++手稿:std::string的相关文章

CString、std::string格式化字符串

=============================CString================================== 当有多个字串时,比如     int   n1   =   5;     int   n2   =   10;     char   sz1[]   =   "abcdefg";     char   sz2[]   =   "hijklmn";         用std中的string如何写出最简单的代码得到MFC中CStr

C++命名空间和头文件的关系 例如已经使用了#include&lt;string&gt;,为什么还要 using std::string?

(1)如果C++程序中使用了带后缀".h"的头文件,那么不必在程序中声明命名空间,只需要文件中包含头文件即可:(2)C++标准要求系统提供的头文件不带后缀".h",但为了表示C++与C的头文件既有联系又有区别,C++中所用头文件不带后缀".h",而是在C语言的相应头文件名之前加上前缀c: (3)自定义的头文件通常带后缀“.h",系统标准库文件不带后缀“.h". (4)因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很

std::string 和 CString问题

std::string stdTemp; CString strTemp; strTemp = stdTemp;    ;//这一步直接赋值可不可以 因为CString可以接受const char*的赋值,而且std::string有个返回const char*的方法,c_str(),所以,应该这样写: strTemp = stdTemp.c_str();

QString、std::string转换成char*

#include <iostream> #include <QtCore/QString> int main() { QString str_Q("cupcupy北京"); int j = str_Q.length(); //11,一个汉字算两个字符 std::string str_string = str_Q.toStdString(); int i = str_string.length();//11,字符串长度不包括结尾的'/0' //c_str()返回的

c++ istream转换为std::string

std::istreambuf_iterator<char> eos; std::string s(std::istreambuf_iterator<char>(stream), eos);---------------------------------------------------------------------------- (could be a one-liner if not for MVP) post-2011 edit, this approach is

源码阅读笔记 &ndash; 3 std::string 与 Short String Optimization

众所周知,大部分情况下,操作一个自动(栈)变量的速度是比操作一个堆上的值的速度快的.然而,栈数组的大小是在编译时确定的(不要说 C99 的VLA,那货的 sizeof 是运行时计算的),但是堆数组的大小在运行时确定,很自由.此外,栈空间比堆空间有限,前者只有几MB,而后者基本上就是你系统内存的大小. 正因为这样,我们想组合两者的优势,既要享受堆空间的自由,又想要在数组较小的时候使用栈空间来加快速度,并且结合两者不会产生额外的开销,这时候,我们需要Short String Optimization

std::string在多字节字符集环境下substr的实现方法

昨天写到<使用多字节字符集的跨平台(PC.Android.IOS.WP)编码/解码方法>中提到服务端使用std::string处理字符串,std::string对多字节字符集支持并不是很完善,std::string中的函数没有对多字节字符集进行直接的支持. 例如直接调用std::string的substr函数,就会导致某些情况下截取的字符串尾部产生非法字符. GB系列多字节字符集基础知识: VC环境下工程设置为多字节字符集,默认使用的是GBK编码,GB2312.GBK.GB18030,这3个都

脱了裤子放屁之std::string

一个天天跟c#奋斗的苦逼c++程序员 改自己以前代码的时候发现有如下几行. char szPath[MAX_PATH] = {0}; GetModuleFileNameA(NULL,szPath,sizeof(szPath)); std::string strPath = szPath; std::string strDir = strPath.substr(0,strPath.find_last_of('\\')); 感觉不爽了,怎么又有char数组 又有string,都用string岂不是更

boost::interprocess::managed_shared_memory(2)(std::string)

#include <iostream> #include <boost/interprocess/managed_shared_memory.hpp> #include <boost/interprocess/allocators/allocator.hpp> #include <boost/interprocess/containers/string.hpp> using namespace std; int main() { //boost::inter