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

C++【STL】(1)string

STL(C++标准模板库)

在这里插入图片描述

string

auto和范围for

auto

会自动推导类型,但不能直接初始化

int a=10;
auto b=a;
auto c='a';

范围for

自动推导类型,自动遍历

int array[]={1,2,3,4,5};
for(auto e:array)
{
cout<<e<<" ";
}
for(auto& e:array)//加上引用可以修改对象
{
e*=2;
}

string

string的底层实现(了解)

namespace bit
{class string{public:char& operator[](size_t pos)//运算符重载{assert(pos < _size);return _str[pos];}private:char*  _str;size_t _size;size_t _capacity;};
}

基本用法

声明与初始化

在C++中,std::string 是标准库提供的字符串类,用于替代C风格字符数组(char*char[]),提供更安全、便捷的字符串操作。以下是 std::string 的核心知识点和用法:

#include <string>
using namespace std;string s1;          // 空字符串
string s2 = "Hello"; // 直接初始化
string s3("World"); // 构造函数初始化
string s4(5, 'a');  // 重复字符:s4 = "aaaaa"
string s5(s2);      // 拷贝初始化:s5 = "Hello"
输入输出
string input;
cin >> input;       // 遇到空格停止(不包含空格)
getline(cin, input); // 读取整行(包含空格)
cout << input;      // 输出字符串

常用操作

操作示例说明
获取长度s.size()s.length()返回字符数量(不含结尾的'\0'
拼接字符串s1 + s2s1.append(s2)直接相加或使用成员函数
访问字符s[0]s.at(0)[]不检查越界,at()会抛异常
清空字符串s.clear()清空内容,size()变为0
判空s.empty()返回bool,等价于 s.size() == 0
子字符串s.substr(pos, len)pos开始截取len个字符
查找s.find("abc")返回首次出现的位置,失败返回string::npos
替换s.replace(pos, len, "new_str")替换指定位置的子串

string 的遍历

#include<string>
int main()
{
string s1;//初始化
string s2("Hello world!");//初始化s2内容
//1.下标+[]
for(size_t =0;i<5;i++)
{
s2[i]+=1;//在s2中添加5个1
}
//打印string,size()可以替换为length()
for(size_t i=0;i<s2.size();i++)
{
cout<<s2[i]<<" ";
}
//2.迭代器(类比于指针)
string::iterator it=s2.begin();
while(it!=s2.end())//不用考虑/0的情况
{
cout<<*it<<" ";
++it;
}
cout<<endl;
}

** 与C风格字符串的转换**

  • string → C字符串
    const char* cstr = s.c_str(); // 返回只读指针(以'\0'结尾)
    
  • C字符串 → string
    char arr[] = "Hello";
    string s = arr; // 直接赋值或构造
    

** 内存管理与性能**

  • 动态内存分配std::string 自动管理内存,动态扩展容量。
  • 预分配内存
    s.reserve(100); // 预分配100字符的内存,减少多次扩容开销
    
  • 释放内存
    s.shrink_to_fit(); // 请求释放多余内存(依赖实现)
    

其他实用功能

字符串比较
if (s1 == s2)  // 直接比较内容(区分大小写)
if (s1.compare(s2) == 0) // 等价于 ==
类型转换
  • 数值 → 字符串
    string num_str = to_string(123); // C++11起支持
    
  • 字符串 → 数值
    int num = stoi("456"); // stol(), stod()等
    

** 注意事项**

  1. 越界访问:使用at()代替[]可避免未定义行为(但性能略低)。
  2. 修改字符串c_str()返回的指针在修改字符串后可能失效。
  3. 性能优化:频繁拼接字符串时,使用 +=append() 更高效,或预分配内存。

综合使用

#include <iostream>
#include <string>
using namespace std;int main() {string s = "Hello";s += " C++";                // s = "Hello C++"s.replace(6, 3, "World");   // s = "Hello World"size_t pos = s.find("World");if (pos != string::npos) {cout << "Found at position: " << pos << endl; // 输出6}return 0;
}

http://www.xdnf.cn/news/303985.html

相关文章:

  • 基于STM32、HAL库的W25X40CLSNIG NOR FLASH存储器驱动应用程序设计
  • 【Linux系统】线程安全
  • unix 详解
  • cuda多维线程的实例
  • 纷析云开源财务软件:重新定义企业财务自主权
  • 《Python星球日记》第35天:全栈开发(综合项目)
  • 基于 Flask的深度学习模型部署服务端详解
  • Linux 工具
  • docker + K3S + Jenkins + Harbor自动化部署
  • Opentack基础架构平台运维
  • iPhone或iPad想要远程投屏到Linux系统电脑,要怎么办?
  • react-12父子组件间的数据传递(子传父)(父传子)- props实现
  • Axure :列表详情、列表总数
  • Spring Boot 3.x集成SaToken使用swagger3+knife4j 4.X生成接口文档
  • 开源与商业:图形化编程工具的博弈与共生
  • ExtraMAME:复古游戏的快乐“时光机”
  • 信息论01:从通信到理论的飞跃
  • 第七章,VLAN技术
  • Github 2025-05-06Python开源项目日报 Top10
  • Kotlin与Java在Android生态中的竞争与互补关系
  • RT-Thread自用记录(暂定)
  • 第四章-初始化Direct3D
  • 餐饮部绩效考核管理制度与综合评估方法
  • 【java】程序设计基础 八股文版
  • 开放的力量:新零售生态的共赢密码
  • 每日算法-250506
  • weapp-vite - 微信小程序工具链的另一种选择
  • OpenGL超大分辨率图像显示
  • Windows玩游戏的时候,一按字符键就显示桌面
  • imapal sql优化之hint