IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++中的string讲解和新特性 -> 正文阅读

[C++知识库]C++中的string讲解和新特性

C++中的字符串

string

string的接口比较复杂,除了字符串的操作,还有类似于容器的操作,比如size()、begin()、end()、push_back()
注意:字符串和容器完全是两个不同的概念。
using string = std::basic_string; // string其实是一个类型别名

using string = std::basic_string<char>;  // string其实是一个类型别名

基于各种原因:在涉及 Unicode、编码转换的时候,尽量不要用 C++,一般只用string就好。

如果只是存储字符,没有string其他不必要的操作,可以使用vector来代替

使用技巧:

1. 字面量后缀s


using namespace std::literals::string_literals;  //必须打开名字空间

auto str = "std string"s;      // 后缀s,表示是标准字符串,直接类型推导

assert("time"s.size() == 4);   // 标准字符串可以直接调用成员函数

C++14中的新增,字符串后面+s,表示:它是string字符串类型,不是C字符串,可以用auto自动类型推导,而且在其他用到字符串的地方,也可以省去声明临时字符串变量的麻烦,效率也会更高。

注意:为了避免与用户自定义字面量的冲突,后缀“s”不能直接使用,必须用 using 打开名字空间才行

2. 原始字符串R"()"

C++11新增原始字符串内容,将具有转义的字符表达出来。
举例:


auto str1 = R"(char""'')";    // 原样输出:char""''
auto str2 = R"(\r\n\t\")";    // 原样输出:\r\n\t\"
auto str3 = R"(\\\$)";        // 原样输出:\\\$
auto str4 = "\\\\\\$";         // 转义后输出:\\\$

如上述表示**R"()"**里括号的内容里放具有转义语义的字符可以直接输出,可轻松表达正则式,或者类似的回车、空格等不可打印的字符\n \r之类的。

但如果表示R"()"呢?
解决办法如下:

auto str5 = R"==(R"(xxx)")==";// 原样输出:R"(xxx)"

3. 字符串转换函数

C++11新增如下转换函数:
stoi()、stol()、stoll() 等把字符串转换成整数;
stof()、stod() 等把字符串转换成浮点数;
to_string() 把整数、浮点数转换成字符串。

assert(stoi("42") == 42);          // 字符串转整数
assert(stol("253") == 253L);       // 字符串转长整数
assert(stod("2.0") == 2.0);       // 字符串转浮点数
assert(to_string(1984) == "1984");       // 整数转字符串

C语言中有atoi()、atol()函数,但是针对的是C语言中的字符串,而不是string,用起来麻烦。

4. 字符串视图类

string 的成本问题。它确实有点“重”,大字符串的拷贝、修改代价很高,所以我们通常都尽量用 const string&,但有的时候还是无法避免(比如使用 C 字符串、获取子串)

C++17 里,string_view,它是一个字符串的视图,成本很低,内部只保存一个指针和长度,无论是拷贝,还是修改,都非常廉价。

可以实现一个在C++11里简化版本


class my_string_view final        // 简单的字符串视图类,示范实现
{
public:
    using this_type = my_string_view;     // 各种内部类型定义
    using string_type = std::string;
    using string_ref_type = const std::string&;

    using char_ptr_type = const char*;
    using size_type = size_t;
private:
    char_ptr_type ptr = nullptr;     // 字符串指针
    size_type len = 0;               // 字符串长度
public:
    my_string_view() = default;
   ~my_string_view() = default;

    my_string_view(string_ref_type str) noexcept
        : ptr(str.data()), len(str.length())
    {}
public:
    char_ptr_type data() const     // 常函数,返回字符串指针
    {
        return ptr;
    }

    size_type size() const        // 常函数,返回字符串长度
    {
        return len;
    }
};
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 23:03:14  更:2021-08-10 23:03:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 16:43:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码