C++ -string -常见用法2
博客主页:【夜泉_ly】
本文专栏:【C++】
欢迎点赞👍收藏⭐关注❤️
文章目录
- 💡前言
- 💡访问及遍历
- 1.速览
- 2.operator[] -重点⭐
- 2.1函数原型
- 2.2用法
- 2.3与at
- 3.迭代器
- 3.1函数原型
- 3.2用法速览
- 3.3简介
- 4.范围for
- 4.1用法速览
- 4.2简介
- 5.访问首尾元素
- 5.1函数原型
- 5.2用法速览
💡前言
在这篇文章中,我将继续简单探讨 C++
中 string
的基本用法。写这篇文章的主要目的是帮助我巩固所学的知识,同时也便于未来的复习和参考。
如果你想大致的了解string
的基本用法,也可以留下来看看。
对于那些希望深入学习更多细节的读者,可以去看看这个网站:cplusplus.com,以获取更全面的参考资料。
💡访问及遍历
1.速览
int main()
{
string str("Hello World");
//最简单的遍历方式就是operator<<
cout << str << endl;
//用下标遍历:
for(size_t i = 0; i < str.size(); i++)
{
cout << str[i];
}
cout << endl;
//用迭代器遍历:
string::iterator i = str.begin();
while(i != str.end())
{
cout << *i++;
}
cout << endl;
//用范围for遍历:
for(auto e : str)
{
cout << e;
}
cout << endl;
//访问首尾元素:
cout << str.front() << " " << str.back() << endl;
return 0;
}
Output:
Hello World
Hello World
Hello World
Hello World
H d
2.operator[] -重点⭐
2.1函数原型
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
2.2用法
和数组的用法是一样的。
2.3与at
at
也是string
类中提供的函数,其函数原型:
char& at (size_t pos);
const char& at (size_t pos) const;
如果正常使用,[]
与at
是一致的,一般不用at
,用[]
。
如果乱传pos
,[]
与at
有些许不同:
-
当
pos
不符合[]
和at
的规范,[]
会断言报错,at
会抛异常:string str("Hello World"); str[666];
try { str.at(666); } catch (const std::exception& e) { cout << e.what() << endl; }
-
对于
[]
:pos
传0 ~ size-1
没有问题。- 如果是常对象,
pos
传size
没有问题。 - 其他情况,都是未定义行为。
-
对于
at
:pos
只能传0 ~ size-1
- 其他情况,会抛出异常。
3.迭代器
3.1函数原型
begin:
iterator begin();
const_iterator begin() const;
end:
iterator end();
const_iterator end() const;
rbegin:
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
rend:
reverse_iterator rend();
const_reverse_iterator rend() const;
cbegin、cend、crbegin、crend:
const_iterator cbegin() const noexcept;
const_iterator cend() const noexcept;
const_reverse_iterator crbegin() const noexcept;
const_reverse_iterator crend() const noexcept;
3.2用法速览
begin、end、rbegin、rend:
int main()
{
string str(6, 0);
//正向遍历并修改:
string::iterator it = str.begin();
for (char i = '0'; it != str.end(); i++, it++)
{
*it = i;
}
cout << "str: " << str << endl;
//反向遍历并打印:
string::reverse_iterator rit = str.rbegin();
while (rit != str.rend())
{
cout << *rit;
rit++;
}
cout << endl;
return 0;
}
Output:
str: 012345
543210
与begin、end、rbegin、rend不同,
cbegin、cend、crbegin、crend只能针对const
修饰的string
类对象,一般不用这几个。
3.3简介
迭代器是像指针一样的类型,有可能是指针,有可能不是指针。
一般用于对应STL
中各种函数的接口,其作用也类似于指针。
在string
中,一般不会手动控制迭代器,推荐使用[]
。
正向迭代:
begin
指向首元素,end
指向末尾元素后一个位置,加加迭代器使其正向移动一步。
反向迭代:
rbegin
指向末尾元素,rend
指向首元素前一个位置,加加迭代器使其反向移动一步。
注意:
这里都是开区间:[begin,end)、 [rbegin,rend)
例如:
void Test()
{
string str("B 6 6 6 E");
string::iterator it_B = str.begin();
string::iterator it_E = str.end();
string::reverse_iterator rit_B = str.rbegin();
string::reverse_iterator rit_E = str.rend();
cout << "*(it_B):" << *it_B << " *(it_E - 1):" << *(it_E - 1) << endl;
cout << "*(rit_B):" << *rit_B << " *(rit_E - 1):" << *(rit_E - 1) << endl;
}
Output:
*(it_B):B *(it_E - 1):E
*(rit_B):E *(rit_E - 1):B
另外,迭代器中加了assert
断言,因此只要位置不合理都会直接报错,比如尝试让上面代码中的it_B--;
:
或者让it_E++
:
4.范围for
只要支持迭代器,就支持范围for!!!
4.1用法速览
void Test()
{
string str("Hello World");
for (char c : str)
cout << c;
cout << endl;
for (char c : str.rbegin())
cout << c;
}
Output:
Hello World
4.2简介
范围for是C++给出的一颗语法糖,使用极其便利。
在上面我标了一句话:只要支持迭代器,就支持范围for!!!
因为范围for是基于迭代器实现的。
void Test()
{
string str("Hello World");
for (auto it = str.begin(); it != str.end(); it++)
cout << *it;
for (char c : str)
cout << c;
}
5.访问首尾元素
5.1函数原型
char& back();
const char& back() const;
char& front();
const char& front() const;
5.2用法速览
只能提供首尾元素,用的不多。
void Test()
{
string str("6 6 6 6 6");
str.front() = 'F';
str.back() = 'B';
cout << "Front:" << str.front() << endl;
cout << "Back:" << str.back() << endl;
}
Output:
Front:F
Back:B
需注意,如果为空串,会导致未定义行为。
希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!