# string 类

# 创建 string 对象

string str1;
string str2{"qwq"};
string str3 = "qwq";
char str4[] = {'q', 'w', 'q', '\0'};
string str5{str3};

# 常用函数

很多内置函数接收的两个参数: index 起始位置, base 往后 base 个字符。 范围 [index,index+base)[index, index + base)

  • s.append((times), string/char, (index), (base)) 追加字符串

  • s.asign((times), string/char, (index), (base)) 重新赋值

    string s1{ "Welcome" };
    s1.append( " to C++" ); // Welcome to C++
    string s2{ "Welcome" };
    s2.append( " to C and C++", 3, 2 ); // Welcome C
    string s3{ "Welcome" };
    s3.append( " to C and C++", 5); // Welcome to C
    string s4{ "Welcome" }; 
    s4.append( 4, 'G' ); // WelcomeGGGG
    // 此处 'G' 仅能是字符而不是字符串
  • s.at(index) 返回 index 位置字符。

  • s.substr(index, (base)) 获取对应区间子串,不指定 n 则为到末尾。

  • s.find(string/char, (index)) 从 index 开始查找 (不指定则为开头),返回第一次出现的位置。

  • s.clear() 清空字符串。

  • s.erase(index, base) 删除对应区间字符。

  • s.empty() 判断是否为空。

    string s1{ "Welcome" };
    cout << s1.at(3) << endl; // c
    cout << s1.erase(2, 3) << endl; // Weme
    cout << s1.substr(1, 2) << endl; //em
    cout << s1.find('e') << endl; // 1
    s1.clear();
    cout << s1.empty() << endl; // 1
  • s.compare(string) 比较字符串(对应 ascii 码作差 s1 - s2)

    string s1{ "Welcome" };
    string s2{ "Welcomg" };
    cout << s1.compare(s2) << endl; // -2
    cout << s2.compare(s1) << endl; // 2
    cout << s1.compare("Welcome") << endl; // 0
  • s.insert(index, string) 插入。

  • s.replace(index, base, string) 替换,注意 \0 占一个位置

    string s1("Welcome to C++");
    s1.insert(11, "Java and "); // Welcome to Java and C++
    string s2{ "AA" };
    s2.insert(1, 4, 'B'); // ABBBBA
    string s3{ "Welcome to Java" };
    s3.replace(11, 4, "C++"); // Welcome to C++
  • stoi(string) 转换为整数

# 运算符

OperatorDescription
[ ]下标访问
=内容复制
+连接,返回新串 (这是好文明)
+=末尾追加
<<字符串插入一个流(目前好像只有 cout)
>>从一个流提取字符串,分界为空格或结束符
==, !=, <, <=, >, >=字符串比较

# array 类 (C++11)

# C 风格数组的缺陷

  • 可能退化为指针
  • 无法确定大小
  • 无法直接赋值
  • 无法自动推断

# C++ 风格的数组

模板类,可容纳任何类型数据。

#include <array>
std::array <Type, Size> ArrayName; // 可进行列表初始化

C++17 新特性:对类模板的参数进行推导(类型,大小)

# array 成员函数

常用:

  • a.at(index) 访问元素。 已重载 [] 运算符。
  • a.front() a.back() 首元素,尾元素。
  • a.size() a.empty() 大小,判空。
  • a.fill(val) 用 val 填满数组。
  • a.swap(b) 互换 a, b 数组。
  • a.begin() a.end() 首尾指针。

实例:

#include <iostream>
#include <array>
#include <algorithm>
using namespace std;
void print(array <int, 3>& arr) // 引用避免拷贝,效率高一 seisei
{
    for (auto x : arr)
        cout << x;
    cout << endl;
}
int main()
{
    array <int, 3> a{2, 3, 3};
    print(a); // 233
// 赋值
    a = {4, 6, 6};
    print(a); // 466
// 交换数组        
    array <int, 3> b{3, 2, 1};
    a.swap(b);
    print(a); // 321
    print(b); // 466
// 大小
    cout << a.size() << ' ' << a.max_size() << endl; // 3 3
// 排序
    sort(a.begin(), a.end());
    print(a); // 123
    sort(a.rbegin(), a.rend());
    print(a); // 321
// 其它函数测试
    a.fill(0);
    print(a); // 000
    cout << a.empty() << endl; // 0
// 二维
    array <array<int, 3>, 4> c;
    return 0;
}

比较全但用处不大的表格:

元素访问
at访问指定的元素,同时进行越界检查
operator[]访问指定的元素,无越界检查
front访问第一个元素
back访问最后一个元素
data返回指向内存中数组第一个元素的指针
容量
empty检查容器是否为空
size返回容纳的元素数
max_size返回可容纳的最大元素数
操作
fill以指定值填充容器
swap交换内容
迭代器
beginc begin返回指向容器第一个元素的迭代器
endc end返回指向容器尾端的迭代器
rbeginc rbegin返回指向容器最后元素的逆向迭代器
rendc rend返回指向前端的逆向迭代器

rbegin()rend() 用来比如从大到小排序什么的老好用了 qwq

更新于