字符串在非常多编程语言中已经成为基本数据类型,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

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

  1. QString 和std::string互转

    std::string cstr; QString qstring; //****从std::string 到QString qstring = QString(QString::fromLocal8 ...

  2. std::string的split函数

    刚刚要找个按空格分离std::string的函数, 结果发现了stackoverflow上的这个问题. 也没仔细看, 直接拿来一试, 靠, 不对啊, 怎么分离后多出个空字符串, 也就是 "a ...

  3. could not deduce template argument for 'const std::_Tree<_Traits> &' from 'const std::string'

    VS2008, 写一个简单的demo的时候出现了这个: 1>------ Build started: Project: GetExportTable, Configuration: Relea ...

  4. 源码阅读笔记 - 3 std::string 与 Short String Optimization

    众所周知,大部分情况下,操作一个自动(栈)变量的速度是比操作一个堆上的值的速度快的.然而,栈数组的大小是在编译时确定的(不要说 C99 的VLA,那货的 sizeof 是运行时计算的),但是堆数组的大 ...

  5. CString std::string相互转换

    CString->std::string 例子: CString strMfc=“test“; std::string strStl; strStl=strMfc.GetBuffer(0); s ...

  6. 计算std:string的字节长度

    如果项目本身是使用 Unicode 字符集和utf8编码,std::string的length(),size()甚至是c的strLen取到的都是字节长度了,比如三个汉字,就是9, 以上情况不满足的话, ...

  7. 【原】error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::string'

    今天遇到一个非常难以排查的BUG,谷歌度娘都问过了依旧无解,最后自己重新尝试之后找到解决方案: 先看一下报错信息: 1>.\lenz.cpp(2197)  error C2679: binary ...

  8. 类型安全且自动管理内存的返回 std::string 的 sprintf 实现

    在这篇博文里,我提到了一个例子,说的是使用C++实现类型安全的printf.这个例子很惊艳,但是在我写程序的时候,并非那么"迫切"地需要它出现在我的工具箱中,因为它并不比普通的pr ...

  9. VC++ 中使用 std::string 转换字符串编码

    目录 第1章说明    1 1.1 代码    1 1.2 使用    4 第1章说明 VC++中宽窄字符串的相互转换比较麻烦,借助std::string能大大减少代码量. 1.1 代码 函数声明如下 ...

随机推荐

  1. 「 SPOJ GSS3 」 Can you answer these queries III

    # 题目大意 GSS3 - Can you answer these queries III 需要你维护一种数据结构,支持两种操作: 单点修改 求一个区间的最大子段和 # 解题思路 一个区间的最大子段 ...

  2. Mysql when case 批量更新

    UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END WHERE id ...

  3. CentOS 7 设置开机自启动

    创建脚本:    #!/bin/bash    echo "hello!" # 启动虚拟环境    cd /data/env/crmenv/bin/    source activ ...

  4. 对于单片机工程.h头文件的管理

    最近工程管理过于混乱,学习了一些工程头文件管理的方法,现在做一个记录,也分享给大家. 目前有两种管理文件的方式: 1.每一个功能模块对应一个文件夹,里面包含一个.c和一个.h文件如下图所示 这样做的好 ...

  5. POJ 1252 Euro Efficiency(最短路 完全背包)

    题意: 给定6个硬币的币值, 问组成1~100这些数最少要几个硬币, 比如给定1 2 5 10 20 50, 组成40 可以是 20 + 20, 也可以是 50 -10, 最少硬币是2个. 分析: 这 ...

  6. selenium,phantomJS,python整合的一个小示例,把某个网页画面整体保存成图片格式。

    本篇将使用selenium,phantomJS和python制作的一个示例,把某个网页整体保存为一个图片文件. 简单介绍下,selenium是一个开源的用于测试web程序的工具,当然,如果你要执行一些 ...

  7. js的几个可能不清晰的问题

    一、关于全局变量的 var test=function(){ var a=1; setTimeout(function(){ console.log(a); a=2; },1000); a=3; se ...

  8. JavaEE JDBC 了解数据库连接池

    了解数据库连接池 @author ixenos 数据库连接是有限的资源,如果用户需要离开应用一段时间,那么他占用的连接就不应该保持开放状态: 另一方面,每次查询都获取连接并在随后关闭它的代价也很高. ...

  9. Android GradientDrawable的XML实现

     Android GradientDrawable的XML实现 Android GradientDrawable与附录文章1类似,这次以XML而非Java代码形式实现.比如写好一个shape文件放 ...

  10. PTA 01-复杂度1 最大子列和问题 (20分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/709 5-1 最大子列和问题   (20分) 给定KK个整数组成的序列{ N_1N​1​ ...