天天看点

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

作者:明政面朝大海春暖花开

命名空间的using声明:

在C++中,使用using声明可以简化对命名空间中成员的访问。通过using声明,可以将特定的命名空间中的成员引入到当前作用域中,使其可以直接使用,而无需使用限定符来访问。

例如,假设有一个命名空间叫做"example",其中包含一个函数叫做"func",可以使用using声明来引入该函数:

#include <iostream>

namespace example {
    void func() {
        std::cout << "Hello, World!" << std::endl;
    }
}

int main() {
    using example::func;
    func(); // 直接调用func,无需限定符
    return 0;
}
           

标准库类型string:

在C++中,标准库中提供了string类型,用于表示和操作字符串。string类型提供了一系列成员函数和操作符,可以方便地进行字符串的处理。

定义和初始化string对象:

可以使用多种方式定义和初始化string对象。以下是几个常见的例子:

#include <string>

std::string str1; // 默认初始化,创建一个空字符串
std::string str2 = "Hello"; // 使用字符串字面值初始化
std::string str3("World"); // 使用字符串字面值初始化
std::string str4(str2); // 使用另一个string对象初始化
           

string对象上的操作:

string对象上有许多常用的操作,包括字符串的连接、比较、查找、截取等。以下是一些示例:

std::string str = "Hello, World!";

str.size(); // 返回字符串的长度
str.empty(); // 判断字符串是否为空

str += " Welcome"; // 字符串连接
str.append(" to C++"); // 字符串连接

str.compare("Hello"); // 比较字符串,返回0表示相等
str.find("World"); // 查找子串的位置
str.substr(7, 5); // 截取子串

str.replace(7, 5, "Universe"); // 替换子串
str.erase(7, 8); // 删除子串
           

处理string对象中的字符:

可以使用下标运算符 [] 或 at() 函数来访问string对象中的字符,并进行相应的处理。

std::string str = "Hello, World!";

char c1 = str[0]; // 使用下标访问字符
char c2 = str.at(7); // 使用at()函数访问字符

str[0] = 'h'; // 修改字符
str.at(7) = 'w'; // 修改字符
           

标准库类型vector:

在C++中,标准库中提供了vector类型,用于表示动态数组。vector提供了一系列成员函数和操作符,可以方便地进行数组的操作和管理。

定义和初始化vector对象:

可以使用多种方式定义和初始化vector对象。以下是几个常见的例子:

#include <vector>

std::vector<int> vec1; // 默认初始化,创建一个空的int类型的vector
std::vector<int> vec2 = {1, 2, 3}; // 使用列表初始化
std::vector<int> vec3(5); // 创建包含5个默认初始化元素的vector
std::vector<int> vec4(5, 10); // 创建包含5个值为10的元素的vector
           

向vector对象中添加元素:

可以使用push_back()函数向vector对象的末尾添加元素。

std::vector<int> vec;

vec.push_back(1); // 向vector中添加元素1
vec.push_back(2); // 向vector中添加元素2
vec.push_back(3); // 向vector中添加元素3
           

其他vector操作:

vector对象还提供了许多其他的操作,如访问元素、插入元素、删除元素等。以下是一些示例:

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

vec.size(); // 返回vector中的元素个数
vec.empty(); // 判断vector是否为空

vec[0]; // 使用下标访问元素
vec.at(2); // 使用at()函数访问元素

vec.front(); // 返回第一个元素
vec.back(); // 返回最后一个元素

vec.insert(vec.begin() + 2, 10); // 在指定位置插入元素
vec.erase(vec.begin() + 1); // 删除指定位置的元素
           

迭代器介绍:

迭代器是一种用于遍历容器中元素的对象。在C++中,容器类(如string、vector等)都提供了迭代器,可以使用迭代器来访问容器中的元素。

使用迭代器:

可以使用迭代器来遍历容器中的元素,并进行相应的操作。以下是一个使用迭代器遍历vector的示例:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " "; // 输出元素的值
    }

    return 0;
}
           

迭代器运算:

迭代器支持一系列的运算操作,如前移、后移、比较等。以下是一些常用的迭代器运算:

std::vector<int>::iterator it = vec.begin();

++it; // 迭代器后移
--it; // 迭代器前移

it++; // 迭代器后移
it--; // 迭代器前移

it + 2; // 迭代器向后移动2个位置
it - 2; // 迭代器向前移动2个位置

it1 == it2; // 判断两个迭代器是否相等
it1 != it2; // 判断两个迭代器是否不相等
           

数组:

数组是一种固定大小的、连续存储的元素序列。在C++中,可以使用内置数组来存储一组相同类型的数据。

定义和初始化内置数组:

可以使用以下方式定义和初始化内置数组:

int arr1[5]; // 定义一个包含5个int类型元素的数组
int arr2[] = {1, 2, 3}; // 使用列表初始化
int arr3[5] = {1, 2, 3}; // 指定数组大小并使用列表初始化
           

访问数组元素:

可以使用下标运算符 [] 来访问数组中的元素,并进行相应的处理。

int arr[5] = {1, 2, 3, 4, 5};

int num1 = arr[0]; // 使用下标访问第一个元素
int num2 = arr[2]; // 使用下标访问第三个元素

arr[1] = 10; // 修改第二个元素的值
arr[3] += 5; // 对第四个元素的值进行加法操作
           

指针和数组:

数组名可以被解释为指向数组第一个元素的指针。可以使用指针来操作数组。

int arr[5] = {1, 2, 3, 4, 5};

int* ptr = arr; // 数组名解释为指向第一个元素的指针

*ptr; // 访问第一个元素
*(ptr + 2); // 访问第三个元素

ptr++; // 指针后移
ptr--; // 指针前移

ptr + 2; // 指针向后移动2个位置
ptr - 2; // 指针向前移动2个位置
           

C风格字符串:

C风格字符串是以null字符 '\0' 结尾的字符数组。可以使用字符数组来表示和操作字符串。

char str1[] = "Hello"; // 使用字符串字面值初始化字符数组
char str2[10]; // 定义一个大小为10的字符数组

strcpy(str2, str1); // 复制字符串
strcat(str2, " World"); // 连接字符串

strlen(str2); // 返回字符串的长度
strcmp(str1, str2); // 比较字符串,返回0表示相等
           

与旧代码的接口:

C++中的string对象和C风格字符串之间可以进行相互转换,从而与旧代码进行接口对接。

#include <iostream>
#include <string>
#include <cstring>

int main() {
    std::string str = "Hello, World!";

    const char* cstr = str.c_str(); // 将string转换为C风格字符串

    std::string newStr(cstr); // 将C风格字符串转换为string

    std::cout << newStr << std::endl;

    return 0;
}
           

多维数组:

多维数组是由多个数组组成的数组。在C++中,可以使用多维数组来存储多维数据。

int arr[3][4]; // 定义一个包含3行4列的二维数组

int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

int num = arr[1][2]; // 访问第二行第三列的元素           

继续阅读