C++ Primer 第三章 字符串、向量和数组

发布时间 2023-08-10 15:46:41作者: Aaaa_aa

命名空间的using声明

using声明可以更简单,更安全的使用到命名空间中的成员。形式为using std:: name; 如(using std::cin)(每个名字都需要独立的using声明)。

定义和初始化string对象、

  • 初始化形式
  1. string s1
  2. string s2(s1)
  3. string s2 = s1
  4. string s3("value")
  5. string s4 = "value"
  6. string s4(n, 'c')

如果使用等号初始化一个变量,实际上执行的是拷贝初始化,编译器将等号右侧的初始值拷贝到新创建的对象中去,如果不使用等号,则执行的是直接初始化

string::size_type类型

size()函数返回的是string::size_type类型的值,它是一个 无符号型整数 如果在表达式中使用了带符号数和无符号数则会产生意想不到的结果

using std:: cin;
using std:: cout;
using std:: string;
int main()
{
    string s;
    cin >> s;//asb
    int n;
    cin >> n;// -2
    if( s.size() < n)
    {
      cout << "YES"<< '\n';
    }
   return 0;
}//YES

字面值和string对象相加

标准库允许把字符字面值和字符串字面值转换成string对象
当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string。

string s1 = s1 + ",";    //正确
string s2 = "hello" + "," ;   //错误, 两个运算对象都不是string
string s3 = s1 + "," + "world"//正确 相当于(s1 + ",") +"world";
//s1 +","的结果是string对象
string s4 = "hello" + "," + s2;//错误 相当于("hello" + ",")+s2;

处理string对象中的字符


遍历string

for (declaration: expression)//expression部分是一个对象,用于表示一个序列
//declaration部分负责定义一个变量,用于访问序列中的基础元素,每次迭代declaration并与分的变量都会被初始化为expression部分的下一个元素值

for(decltype(s.size()) idx = 0;idx != s.size(); ++idx)
//这里使用decltype关键字声明idx是s.size()函数返回值的类型,也就是string::size_type

如果想改变string对象中字符的值,必须把循环变量定义为引用类型

string s("Hello!")
for(auto &c : s)
c = toupper(c);
cout << s << endl;//HELLO!

字符串下标

无论何时用到字符串下标,都要注意检查其合法性,下标是string::size_type类型,也就是无符号类型,所以可以大于等于0。实际应用时,还需要检查是否小于字符串s.size。