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

C++中 string 类及迭代器相关知识详解

目录

一、 string 类的基本使用

1. 字符串的定义和初始化

2. 遍历字符串

下标访问方式

迭代器访问方式

正向迭代器:

反向迭代器:

范围 for 循环方式

二、 string 类的成员函数

1. 容量相关函数

2. 扩容机制

三、迭代器与容器的配合

1.  vector 容器的迭代器使用

2.  list 容器的迭代器使用

四、实际应用案例:字符串数字相加


一、 string 类的基本使用

在C++ 中, string 类是用于处理字符串的强大工具。它包含在 <string> 头文件中。下面是一些基本的使用示例:

1. 字符串的定义和初始化

cpp

#include <iostream>

#include <string>



int main() {

    std::string s0; // 定义一个空字符串

    std::string s1("hello world"); // 使用字符串字面量初始化

    std::cout << s1 << std::endl;

    return 0;

}

在上述代码中,我们定义了一个空字符串 s0 和一个初始化为"hello world"的字符串 s1 ,并将 s1 输出到控制台。

2. 遍历字符串

下标访问方式

cpp

#include <iostream>

#include <string>



int main() {

    std::string s1("hello world");

    for (size_t i = 0; i < s1.size(); i++) {

        std::cout << s1[i];

    }

    std::cout << std::endl;

    return 0;

}

通过 size() 函数,length也行,但不推荐获取字符串长度,利用下标 [] 操作符遍历字符串中的每个字符并输出。

迭代器访问方式(类似于指针,但不完全是)

正向迭代器:
cpp

#include <iostream>

#include <string>



int main() {

    std::string s1("hello world");

    std::string::iterator it = s1.begin();

    while (it != s1.end()) {

        std::cout << *it << " ";

        ++it;

    }

    std::cout << std::endl;

    return 0;

}

这里使用 begin() 函数获取指向字符串开头的迭代器, end() 函数获取指向字符串末尾(实际是末尾元素的下一个位置)的迭代器,通过迭代器遍历并输出字符。

反向迭代器:
cpp

#include <iostream>

#include <string>



int main() {

    std::string s1("hello world");

    std::string::reverse_iterator rit = s1.rbegin();

    while (rit != s1.rend()) {

        std::cout << *rit << " ";

        ++rit;

    }

    std::cout << std::endl;

    return 0;

}

 rbegin() 函数获取指向字符串末尾的反向迭代器, rend() 函数获取指向字符串开头(实际是开头元素的前一个位置)的反向迭代器,实现反向遍历。

范围 for 循环方式

cpp

#include <iostream>

#include <string>



int main() {

    std::string s1("hello world");

    for (auto ch : s1) {

        std::cout << ch << " ";

    }

    std::cout << std::endl;

    return 0;

}



范围 for 循环会自动遍历字符串中的每个字符,代码简洁明了。

二、 string 类的成员函数

1. 容量相关函数

-  size() 和 length() :这两个函数功能相同,都用于返回字符串中有效字符的个数。

-  capacity() (借鉴数据结构):返回当前字符串在重新分配内存之前能够存储的字符数。

-  max_size()(不稳定,取决于编译器) :返回字符串能够容纳的最大字符数。

示例代码:

cpp

#include <iostream>

#include <string>



int main() {

    std::string s1("hello world");

    std::cout << "size: " << s1.size() << std::endl;

    std::cout << "length: " << s1.length() << std::endl;

    std::cout << "capacity: " << s1.capacity() << std::endl;

    std::cout << "max_size: " << s1.max_size() << std::endl;

    return 0;

}

2. 扩容机制

当向字符串中添加元素导致当前容量不足时, string 类会自动扩容。以下是演示 string 扩容过程的代码:

cpp

#include <iostream>

#include <string>



int main() {

    std::string s1;

    size_t old = s1.capacity();

    for (size_t i = 0; i < 100; i++) {

        s1 += 'x';

        if (old != s1.capacity()) {

            std::cout << "扩容: " << s1.capacity() << std::endl;

            old = s1.capacity();

        }

    }

    return 0;

}

在这个示例中,每次向字符串 s1 添加一个字符 'x' ,如果容量发生变化,就输出新的容量值。通常 string 的扩容策略是按照一定倍数(常见为1.5倍或2倍)增加容量。

不同编辑器有所不同:

三、迭代器与容器的配合(只做示范,后期具体会分析)

在C++ 中,迭代器不仅用于 string 类,还广泛应用于其他容器,如 vector 、 list 等,并且使用方式类似。

1.  vector 容器的迭代器使用

cpp

#include <iostream>

#include <vector>



int main() {

    std::vector<int> v;

    v.push_back(1);

    v.push_back(2);

    v.push_back(3);

    v.push_back(4);



    std::vector<int>::iterator vit = v.begin();

    while (vit != v.end()) {

        std::cout << *vit << " ";

        ++vit;

    }

    std::cout << std::endl;

    return 0;

}

这里创建了一个 vector 容器并插入一些元素,通过迭代器遍历并输出容器中的元素。

2.  list 容器的迭代器使用

cpp

#include <iostream>

#include <list>



int main() {

    std::list<int> lt;

    lt.push_back(10);

    lt.push_back(20);

    lt.push_back(3);



    std::list<int>::iterator lit = lt.begin();

    while (lit != lt.end()) {

        std::cout << *lit << " ";

        ++lit;

    }

    std::cout << std::endl;

    return 0;

}

对于 list 容器,同样使用迭代器来遍历其中的元素。

此外,还可以使用标准算法结合迭代器对容器进行操作,例如:

cpp

#include <iostream>

#include <vector>

#include <algorithm>



int main() {

    std::vector<int> v = {4, 2, 3, 1};

    std::reverse(v.begin(), v.end()); // 反转vector

    for (auto e : v) {

        std::cout << e << " ";

    }

    std::cout << std::endl;



    std::sort(v.begin(), v.end()); // 排序vector

    for (auto e : v) {

        std::cout << e << " ";

    }

    std::cout << std::endl;

    return 0;

}

 reverse 算法用于反转容器中的元素顺序, sort 算法用于对容器中的元素进行排序,它们都通过迭代器指定操作的范围。

四、实际应用案例:字符串数字相加(下期详解)

假设有两个用字符串表示的数字,需要将它们相加并以字符串形式返回结果。以下是实现代码:

cpp

#include <iostream>

#include <string>



std::string addStrings(std::string num1, std::string num2) {

    int end1 = num1.size() - 1, end2 = num2.size() - 1;

    std::string strRet;

    int carry = 0;

    while (end1 >= 0 || end2 >= 0) {

        int val1 = end1 >= 0? num1[end1] - '0' : 0;

        int val2 = end2 >= 0? num2[end2] - '0' : 0;

        int ret = val1 + val2 + carry;

        carry = ret / 10;

        ret = ret % 10;

        strRet += ('0' + ret);

        --end1;

        --end2;

    }

    if (carry > 0) {

        strRet += ('0' + carry);

    }

    std::reverse(strRet.begin(), strRet.end());

    return strRet;

}

在这个函数中,我们从两个字符串数字的末尾开始逐位相加,处理进位情况,最后将结果字符串反转得到正确的顺序。

通过对 string 类和迭代器的深入学习与实践,可以更好地处理字符串相关操作以及对容器进行遍历和算法操作,提高C++ 编程的效率和能力。

相关文章:

  • 详解MYSQL表空间
  • 如何为您的设计应用选择高速连接器
  • Hello Java!
  • ngx_conf_read_token - events
  • CMake set_source_files_properties用法详解
  • 机械革命 无界15X MT7922 debian12 蓝牙无法使用的研究
  • 【NLP】 18. Tokenlisation 分词 BPE, WordPiece, Unigram/SentencePiece
  • 【navicat16版本安装】
  • 基于FPGA的智能垃圾桶设计-超声波测距模块-人体感应模块-舵机模块 仿真通过
  • 服务器远程端口详解
  • MySQL与Oracle深度对比
  • 如何在英文学术写作中正确使用标点符号?
  • JavaScript 基础特性
  • XAMPP 下载、部署及使用入门
  • [redis进阶一]redis的持久化(2)AOF篇章
  • 设计模式(结构型)-桥接模式
  • Keil创建自定义的STM32标准库工程
  • jetpack之lifecycle的原理分析
  • 4.13学习总结
  • rag相关的技术
  • 气急败坏!20多名台湾艺人被台当局列为“重点核查对象”
  • 中期选举后第三势力成“莎拉弹劾案”关键,菲律宾权斗更趋复杂激烈
  • 病重老人取钱在银行门口去世,家属:已协商一致
  • 四川甘孜炉霍县觉日寺管委会主任呷玛降泽被查
  • 泽连斯基抵达安卡拉,称乌将派出最高级别代表团参与谈判
  • 中国乒协坚决抵制恶意造谣,刘国梁21日将前往多哈参加国际乒联会议