C++ string和vector

本文详细介绍了C++中的std::string和vector,包括它们的特性、构造方法、主要操作、容量管理以及示例代码,展示了如何使用这两种数据结构进行字符串处理和动态数组操作。
摘要由CSDN通过智能技术生成

C++ string和vector

string

在C++中,std::string是一个表示文本字符串的类。它封装了字符数组的处理,提供了丰富的成员函数,用于执行各种字符串操作,如连接、查找、比较、替换等。std::string类定义在标准库头文件<string>中,是标准模板库(STL)的一部分。

特性和优势

  • 动态大小:与C风格的字符串(字符数组)相比,std::string的大小可以根据内容动态变化,无需手动管理内存。
  • 安全和便捷:提供了一系列成员函数和操作符重载,使字符串操作更安全、更直观。
  • 自动内存管理:自动处理内存分配和释放,减少了内存泄漏和缓冲区溢出的风险。
  • 与C风格字符串兼容:可以方便地与需要C风格字符串(char*const char*)的函数互操作。

主要操作

构造和赋值
  • 构造函数std::string提供了多种构造函数,允许从C风格字符串、另一个std::string对象、字符序列等创建字符串。
  • 赋值操作:可以使用=操作符或assign()方法从另一个std::string对象或C风格字符串赋值。
访问和修改
  • 访问字符:使用[]操作符或at()方法访问特定位置的字符。at()方法提供边界检查。
  • 修改字符串append(), insert(), replace(), 和 erase() 方法用于修改字符串的内容。
  • 添加和删除push_back()在字符串末尾添加字符,pop_back()删除末尾字符。
容量和大小
  • 获取长度size()length()方法返回字符串的长度。
  • 调整大小resize()方法可以增加或减少字符串的长度,可选地填充新字符。
  • 容量和预留空间capacity()返回字符串当前分配的存储空间大小,reserve()可用于增加存储空间以避免频繁重新分配。
字符串操作
  • 查找和替换find(), rfind(), find_first_of(), find_last_of(), find_first_not_of(), 和 find_last_not_of() 方法用于查找字符或子字符串。replace()方法用于替换字符串中的内容。
  • 子字符串substr()方法返回字符串的一个子串。
  • 比较compare()方法用于比较两个字符串。
输入/输出
  • 输入:可以使用标准输入流(std::cin)直接读取到std::string对象。
  • 输出:可以使用标准输出流(std::cout)直接输出std::string对象。
与C风格字符串互操作
  • 获取C风格字符串c_str()data()方法提供对字符串内容的只读访问,返回一个指向以空字符终止的字符数组的指针。

示例代码

#include <iostream>
#include <string>

int main() {
    std::string str1 = "Hello, ";
    std::string str2 = "World!";
    
    // 字符串连接
    std::string str3 = str1 + str2;
    std::cout << str3 << std::endl; // 输出: Hello, World!
    
    // 访问和修改
    char &ch = str3.at(7); // 使用at()访问,提供边界检查
    ch = 'w';
    std::cout << str3 << std::endl; // 输出: Hello, world!
    
    // 查找和替换
    size_t pos = str3.find("world");
    if (pos != std::string::npos) {
        str3.replace(pos, 

5, "everyone");
    }
    std::cout << str3 << std::endl; // 输出: Hello, everyone!
    
    // 获取子字符串
    std::string sub = str3.substr(7, 8); // 从位置7开始获取8个字符
    std::cout << sub << std::endl; // 输出: everyone
    
    // 长度和容量
    std::cout << "Length: " << str3.length() << ", Capacity: " << str3.capacity() << std::endl;
    
    // 输入
    std::string input;
    std::cout << "Enter a string: ";
    std::getline(std::cin, input); // 读取一行到input
    std::cout << "You entered: " << input << std::endl;
    
    return 0;
}

std::string类通过提供这些功能,极大地简化了字符串处理的复杂性,使得C++程序员可以更加专注于逻辑和算法的实现。

示例代码

#include <iostream>
#include <string>
using namespace std;

int main() {
    // 创建并初始化两个字符串s和s2
    string s = "hello", s2("world");
    // 打印字符串s的长度
    cout << s.size() << endl; // 输出: 5

    // 使用substr()获取s字符串从索引1开始的3个字符的子串,并赋值给s3
    string s3 = s.substr(1, 3); // s3 = "ell"
    cout << s3 << endl; // 输出: ell

    // 将字符串s和s2连接,中间没有插入任何字符,并赋值给s4
    string s4 = s + "" + s2; // s4 = "helloworld"
    cout << s4 << endl; // 输出: helloworld

    // 修改s4字符串的第一个字符为'H',第7个字符(索引6)为'X'
    s4[0] = 'H'; // s4变为"Helloworld"
    s4[6] = 'X'; // s4变为"HellowXrld"
    cout << s4 << endl; // 输出: HellowXrld

    // 查找字符串s4中"orl"的位置
    int pos = s4.find("orl"); // pos = 7
    cout << pos << endl; // 输出: 7,因为"orl"从索引7开始

    // 在s4的第4个位置(索引3)插入字符串"ABCDE"
    s4.insert(3, "ABCDE"); // s4变为"HelABCDElowXrld"
    cout << s4 << endl; // 输出: HelABCDElowXrld

    // 使用循环逐字符打印s4,字符之间用"-"分隔
    for (int i = 0; i < s4.size(); i++)
        cout << s4[i] << "-"; // 输出: H-e-l-A-B-C-D-E-l-o-w-X-r-l-d-
    cout << "\n";

    return 0;
}

vector

在C++中,vector是一个封装了动态大小数组的序列容器。作为标准模板库(Standard Template Library, STL)的一部分,vector可以存储任何类型的对象,从内置数据类型到复杂的类对象。vector提供了一种方式,使得用户可以使用类似于数组的方式访问元素,同时享受到动态数组的便利,如自动管理大小和容量。

vector的特点

  • 动态数组vector的大小可以在运行时动态变化,自动处理内存的分配和释放。
  • 随机访问:提供对任意元素的快速随机访问,时间复杂度为O(1)。
  • 尾部操作优化:在vector的尾部添加或删除元素是非常高效的,但在其他位置插入或删除元素可能需要移动元素,因此效率较低。
  • 内存管理:可以预分配内存以减少重新分配内存时的开销,提高效率。

vector的基本操作

构造和赋值
  • 可以使用多种构造函数创建vector,包括默认构造函数、拷贝构造函数、范围构造函数等。
  • 支持使用=操作符进行赋值。
访问元素
  • 使用[]操作符或at()成员函数访问特定位置的元素。at()函数提供范围检查。
  • front()back()成员函数分别访问第一个和最后一个元素。
修改容器
  • push_back()vector的末尾添加一个元素。
  • pop_back()删除vector末尾的元素。
  • insert()在指定位置插入一个或多个元素。
  • erase()删除指定位置或范围内的元素。
  • clear()删除所有元素。
  • resize()改变vector的大小。
容器信息
  • size()返回vector中元素的数量。
  • empty()检查vector是否为空。
  • capacity()返回在重新分配内存之前vector可以包含的最大元素数。
  • reserve()增加vector的容量以存储更多元素,但不改变其大小。

示例代码

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> vec; // 创建一个空的int类型vector

    // 添加元素
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);

    cout << "Vector elements: ";
    for(int i = 0; i < vec.size(); i++) {
        cout << vec[i] << " "; // 使用下标访问
    }
    cout << endl;

    // 访问第一个和最后一个元素
    cout << "First element: " << vec.front() << endl;
    cout << "Last element: " << vec.back() << endl;

    // 修改vector,插入元素到第二个位置
    vec.insert(vec.begin() + 1, 15);

    cout << "Vector elements after insertion: ";
    for(int elem : vec) {
        cout << elem << " "; // 使用范围for循环
    }
    cout << endl;

    // 删除第三个元素
    vec.erase(vec.begin() + 2);

    cout << "Vector elements after erasure: ";
    for(auto& elem : vec) {
        cout << elem << " "; // 使用范围for循环和引用访问
    }
    cout << endl;

    // 清空vector
    vec.clear();
    cout << "Vector is " << (vec.empty() ? "empty" : "not empty") << endl;

    return 0;
}

这个示例展示了vector的一些基本用法,包括初始化、添加元素、访问元素、插入和删除元素以及清空vector。通过这些操作,vector提供了比传统数组更灵活和强大的数据结构。

示例代码

#include <iostream>
#include <vector> // 包含vector头文件
using namespace std;

int main() {
    vector<int> v = { 7,5,16,8 }; // 初始化vector v,包含四个整数

    v.push_back(25); // 在vector的末尾添加一个元素25
    v.push_back(13); // 在vector的末尾再添加一个元素13

    // 使用for循环遍历vector并打印每个元素,元素之间用制表符分隔
    for (int i = 0; i < v.size(); i++)
        cout << v[i] << '\t';
    cout << '\n'; // 在打印完所有元素后换行

    v.pop_back(); // 删除vector末尾的元素(13被删除)

    // 再次遍历并打印当前vector的所有元素,此时最后一个元素13已被删除
    for (int i = 0; i < v.size(); i++)
        cout << v[i] << '\t';
    cout << '\n'; // 打印完毕后换行
        
    v.resize(2); // 调整vector的大小为2,这将丢弃除前两个元素外的所有元素

    // 最后一次遍历并打印调整大小后的vector,此时vector只包含两个元素
    for (int i = 0; i < v.size(); i++)
        cout << v[i] << '\t';
    cout << '\n'; // 打印完毕后换行

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YRr YRr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值