当前位置: 首页 > news >正文

C++ string

一、std::string 概述

std::string 是C++标准库中用于表示和操作字符串的类,属于<string>头文件。它封装了动态字符数组,提供丰富的成员函数和操作符重载,支持高效的内存管理和字符串操作

二、构造函数(Constructors)

std::string 有多个构造函数重载,用于不同场景下的字符串初始化:

1. 默认构造函数

string str;  // 创建空字符串

2. 使用C风格字符串构造

const char* cstr = "Hello";
string str1(cstr);    // "Hello"
string str2("World"); // "World"

3. 使用部分字符构造

string str3("Hello World", 5); // 取前5个字符 -> "Hello"

4. 重复字符构造

string str4(5, 'a'); // "aaaaa"

5. 使用迭代器范围构造

std::vector<char> vec = {'a', 'b', 'c'};
string str5(vec.begin(), vec.end()); // "abc"

6. 拷贝构造函数

string str6(str5); // 拷贝str5的内容

三、成员函数详解

1. append():追加内容

功能:在字符串末尾追加内容,返回*this
重载形式

string& append(const string& str);
string& append(const char* s);
string& append(const char* s, size_t n);  // 追加s的前n个字符
string& append(size_t n, char c);         // 追加n个字符c
string& append(InputIt first, InputIt last); // 迭代器范围

示例

string s = "Hello";
s.append(" World");       // "Hello World"
s.append(3, '!');         // "Hello World!!!"
s.append(s.begin(), s.begin()+5); // 追加自身前5个字符 -> "Hello World!!!Hello"

2. assign():替换内容

功能:替换当前字符串内容,返回*this
重载形式append()类似,但用于替换而非追加:

string& assign(const string& str);
string& assign(const char* s);
string& assign(const char* s, size_t n);//从指针s指向的位置复制前n个字符替换
string& assign(size_t n, char c);//将字符串替换为n个重复的字符c。

示例

string s = "Hello";
s.assign(5, 'x'); // "xxxxx"

3. replace():替换子串

功能:替换字符串中指定位置的子串。
重载形式

// 替换位置[pos, pos+len)的内容
string& replace(size_t pos, size_t len, const string& str);
string& replace(size_t pos, size_t len, const char* s);
string& replace(size_t pos, size_t len, const char* s, size_t n); // 使用s的前n个字符
string& replace(size_t pos, size_t len, size_t n, char c);

// 使用迭代器范围替换
string& replace(iterator first, iterator last, const string& str);

示例

string s = "Hello World";
s.replace(6, 5, "Universe");   // "Hello Universe"
s.replace(s.begin(), s.begin()+5, "Hi"); // "Hi Universe"

4. find():查找子串

功能:返回子串首次出现的位置,未找到则返回string::npos
重载形式

size_t find(const string& str, size_t pos = 0) const;
size_t find(const char* s, size_t pos = 0) const;
size_t find(const char* s, size_t pos, size_t n) const; // 查找s的前n个字符
size_t find(char c, size_t pos = 0) const;

示例

string s = "Hello World";
size_t pos = s.find("World"); // pos = 6
if (pos != string::npos) {
    cout << "Found at position " << pos << endl;
}

5. substr():获取子串

功能:返回从pos开始的len个字符的子串。

string substr(size_t pos = 0, size_t len = npos) const;

示例

string s = "Hello World";
string sub = s.substr(6, 5); // "World"

6. compare():比较字符串

功能:按字典序比较字符串,返回0(相等)、正数(大于)或负数(小于)。
重载形式

int compare(const string& str) const;
int compare(size_t pos, size_t len, const string& str) const;
int compare(const char* s) const;
int compare(size_t pos, size_t len, const char* s, size_t n) const;

示例

string s1 = "apple";
string s2 = "banana";
int result = s1.compare(s2); // result < 0,因为"apple" < "banana"

7. insert():插入内容

功能:在指定位置插入内容。
重载形式

string& insert(size_t pos, const string& str);
string& insert(size_t pos, const char* s);
string& insert(size_t pos, const char* s, size_t n);
string& insert(size_t pos, size_t n, char c);

示例

string s = "Hello";
s.insert(5, " World"); // "Hello World"

8. erase():删除字符

功能:删除指定位置的字符或子串。

string& erase(size_t pos = 0, size_t len = npos);
iterator erase(iterator position);
iterator erase(iterator first, iterator last);

示例

string s = "Hello World";
s.erase(5, 6); // 删除从位置5开始的6个字符 -> "Helloworld"

9. c_str() 和 data()

功能:返回指向内部字符数组的const char*指针。

const char* c_str() const noexcept;
const char* data() const noexcept;

示例

string s = "Hello";
const char* p = s.c_str(); // 指向以'\0'结尾的C字符串

10. 容量相关函数

  • size()length():返回字符数量。
  • capacity():返回当前分配的内存容量。
  • reserve(size_t n):预分配至少n个字符的内存。
  • shrink_to_fit():减少内存占用以适应实际大小。

四、操作符重载

  • operator=:赋值操作。
  • operator+=:追加内容。
  • operator[]:访问字符(不检查越界)。
  • operator+:连接字符串(非成员函数)。

示例

string s1 = "Hello";
string s2 = s1 + " World"; // "Hello World"
s1[0] = 'h'; // "hello"

相关文章:

  • ES6(1) 简介与基础概念
  • 计算机二级——Python:Day1
  • 力扣215.数组中的第K个最大元素--堆排序法(java)
  • 透过安全事件看软件组成分析SCA
  • 26岁赵露思病好后大变样,穿披肩染奶奶灰意外惊艳,复工后美回巅峰
  • 专题|Python贝叶斯金融数据应用实例合集:随机波动率SV模型、逻辑回归、参数更新、绩效比较BEST分析亚马逊股票、普尔指数...
  • Linux 守护进程与 SSH 安全配置指南
  • 【草原之歌】:守护绿色的律动与《草原法》的力量
  • Practical Coding Function Design for Time-of-Flight Imaging文章解读,CVPR2019
  • 智能合约:Solidity(基于以太坊或兼容链,如 Polygon、BSC)(仅供学习区块链知识,不可进行违法开发应用)
  • 基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战
  • php将身份证号写入excel文件出现科学计数法问题解决
  • 详解CPU的组成与功能
  • leetcode hot100贪心
  • 使用自动导入后,eslint报错 eslint9
  • CCF CSP 第30次(2023.09)(1_坐标变换_C++)(先输入再计算;边输入边计算)
  • Xshell连接autodl时提示ssh服务器拒绝了密码,请再试一次
  • 【大模型学习】第十九章 什么是迁移学习
  • 微店关键词搜索商品详情API接口解析与应用
  • C++双端队列知识点+习题
  • 网站ar怎么做/蚁坊软件舆情监测系统
  • 如何查看网站在哪里做的/app联盟推广平台
  • 网站建设素材使用应该注意什么/网络营销中的四种方法
  • 住房和城乡建设部网站监理工程师/手机网页设计制作网站
  • 福州网站建设费用/正规网络推广服务
  • 白云做网站SEO/手机一键优化