目录
[一、下标+[ ]](#一、下标+[ ])
一、下标+[ ]
方式一:下标+[ ]方式
**string类的[]运算符重载提供了类似数组的访问接口,**但背后是完整的面向对象封装,兼具易用性和安全性。

//下标+[]->可读可写
void test01()
{
//下标+[]->可读可写
string s1("hello world");
//遍历string字符串
for (int i = 0; i < s1.size(); i++)
{
cout << s1[i] << " ";
}
cout << endl;
//修改string字符串
for (int i = 0; i < s1.size(); i++)
{
s1[i]++;
cout << s1[i] << " ";
}
cout << endl;
//需要注意的是区分的s1[1]和s2[1]是不一样的
//s1[1]底层调用的是 char& operator[](size_t pos)
//s2[1]中s2是数组名,代表首元素地址 实际是*(s2+1)
char s2[] = "hello world";
s1[1];
s2[1];
}
二、迭代器
方式二:迭代器,迭代器是类似于指针一样的抽象数据类型,它提供了统一的容器访问接口。对于不同的容器,迭代器的具体实现可能不同(可能是指针,也可能是类对象)。begin() 返回指向容器第一个元素的迭代器,end() 返回指向容器最后一个元素之后位置的迭代器,迭代器范围是左闭右开区间 [begin, end)

void test02()
{
//迭代器->可读可写
string s1("hello world");
//遍历string字符串
string::iterator it1 = s1.begin();
while (it1 != s1.end())
{
cout << *it1 << " ";
it1++;
}
cout << endl;
//修改string字符串
string::iterator it2 = s1.begin();
while (it2 != s1.end())
{
(*it2)++;
cout << *it2 << " ";
it2++;//////////////
}
cout << endl;
//输出结果
//h e l l o w o r l d
//i f m m p ! x p s m e
}
三、范围for
方式三:范围for循环底层基于迭代器实现,自动完成迭代和结束判断。参数类型的选择应根据需求决定:只需读取且对象较小时使用传值,需要修改元素或避免大对象的拷贝开销时使用引用,确保元素不被修改时使用const引用。
-
auto(传值):创建临时对象,原元素不受影响,适合内置类型和小对象 -
auto&(引用):可修改原元素,避免大对象的拷贝开销 -
const auto&(常量引用):只读访问,避免拷贝,保证原数据不变"void test03()
{
//范围for
string s1("hello world");//遍历string字符串 //s1会取出数据赋值给ch,但是没法修改ch,需要加引用才可以修改 for (auto ch : s1) { cout << ch << " "; } cout << endl; //修改string字符串,注意这段代码不会打印i f m m p ! x p s m e //原因是后置++,先输出第一个字符h,再将h->i,输出字符e,再将e->f...... //for (auto& ch : s1) //{ // cout << (ch++) << " "; //} //cout << endl; //正确输出+修改 for (auto& ch : s1) { ch++;//先对字符++ cout << ch << " "; } cout << endl; //输出结果 //h e l l o w o r l d //i f m m p ! x p s m e}