1. 简介
在C++中,字符串string、向量vector和数组都是常见的数据结构。它们在程序中的使用相似,但又有所不同。
2. 字符串string
2.1 定义和初始化
string
是一种STL类,也是C++中常用的字符串类型。可以用相应的构造函数或者运算符对其进行初始化。下面是一些常见的初始化方式:
// default constructor,创建一个空的字符串
string str1;
// 字符串常量初始化
string str2("Hello, World!");
// 复制构造函数
string str3(str2);
// 通过赋值运算符或者assign函数进行初始化
string str4;
str4 = "Hello, C++!";
str4.assign("Hello, C++!");
2.2 字符串操作
string
的成员函数可以方便地对字符串进行修改和操作。以下是一些常用的成员函数:
size()
:字符串的长度(即字符的个数)
at()
:返回指定位置的字符
operator []
:返回指定位置的字符
append()
:将字符串或字符序列附加到当前字符串末尾
insert()
:在指定位置插入一个字符或字符串
erase()
:删除指定位置的字符或一个字符序列
replace()
:替换指定位置的字符或一个字符序列
find()
:在字符串中查找一个子串
substr()
:返回一个子串
下面是一些字符串操作的示例代码:
// 声明和初始化
string str("Hello, World!");
// 输出字符串的长度
cout << "The length of the string is " << str.size() << endl;
// 访问字符串中的字符
cout << "The first character is " << str[0] << endl;
// 在字符串末尾添加一个字符
str.append(1, '!');
// 在指定位置插入一个字符
str.insert(7, ", C++");
// 删除指定位置的字符
str.erase(12, 1);
// 替换指定位置的字符
str.replace(7, 1, "++");
// 在字符串中查找一个子串
int pos = str.find("World");
if (pos != string::npos) {
cout << "Found 'World' at position " << pos << endl;
}
// 返回一个子串
string substr = str.substr(7, 6);
cout << "The substring is " << substr << endl;
2.3 对比和拼接
可以用运算符对两个字符串进行对比或拼接。下面是一些示例代码:
string str1("Hello");
string str2("World");
// 对比两个字符串
if (str1 == str2) {
cout << "The two strings are equal" << endl;
} else {
cout << "The two strings are not equal" << endl;
}
// 拼接两个字符串
string str3 = str1 + ", " + str2;
cout << "The concatenated string is " << str3 << endl;
3. 向量vector
3.1 定义和初始化
vector
是一种动态数组,可以在运行时动态扩展。可以用相应的构造函数或者运算符对其进行初始化。下面是一些常见的初始化方式:
// default constructor,创建一个空的向量
vector<int> vec1;
// 创建一个指定大小的向量
vector<int> vec2(5);
// 创建一个指定大小,并初始化每个元素的向量
vector<int> vec3(5, 0);
// 复制构造函数
vector<int> vec4(vec3);
// 通过赋值运算符或者assign函数进行初始化
vector<int> vec5;
vec5 = {1, 2, 3};
vec5.assign({4, 5, 6});
3.2 向量操作
vector
的成员函数可以方便地对向量进行修改和操作。以下是一些常用的成员函数:
size()
:向量中元素的个数
at()
:返回指定位置的元素
operator []
:返回指定位置的元素
push_back()
:在向量的末尾添加一个元素
pop_back()
:删除向量的末尾元素
insert()
:在指定位置插入一个元素或元素序列
erase()
:删除指定位置的元素或一个元素序列
clear()
:删除向量中的所有元素
下面是一些向量操作的示例代码:
// 声明和初始化
vector<int> vec{1, 2, 3, 4, 5};
// 输出向量的长度
cout << "The size of the vector is " << vec.size() << endl;
// 访问向量中的元素
cout << "The first element is " << vec[0] << endl;
// 在向量末尾添加一个元素
vec.push_back(6);
// 在指定位置插入一个元素
vec.insert(vec.begin() + 2, 0);
// 删除向量的末尾元素
vec.pop_back();
// 删除指定位置的元素
vec.erase(vec.begin() + 3);
// 删除一个元素序列
vec.erase(vec.begin() + 1, vec.end() - 2);
// 删除向量中的所有元素
vec.clear();
3.3 遍历和排序
vector
可以用迭代器进行遍历。还可以用STL中的sort
函数对向量的元素进行排序。下面是一些示例代码:
vector<int> vec{3, 4, 1, 2, 5};
// 遍历向量
for (auto it = vec.begin(); it != vec.end(); ++it) {
cout << *it << ' ';
}
cout << endl;
// 对向量的元素进行排序
sort(vec.begin(), vec.end());
// 再次遍历向量
for (int i = 0; i < vec.size(); ++i) {
cout << vec[i] << ' ';
}
cout << endl;
4. 数组
4.1 定义和初始化
C++中的数组是一种固定大小的容器,在声明时需要指定数组的类型和大小。下面是一些常见的数组定义方式:
int arr1[5]; // 定义一个有5个元素的整型数组
int arr2[] = {1, 2, 3}; // 定义并初始化一个整型数组
int arr3[3][2] = {{1, 2}, {3, 4}, {5, 6}}; // 定义了一个3行2列的二维数组
4.2 数组操作
数组的元素可以用下标进行访问和修改。以下是一些数组操作的示例代码:
int arr[] = {1, 2, 3, 4, 5};
// 输出数组的长度
cout << "The size of the array is " << sizeof(arr) / sizeof(int) << endl;
// 访问数组中的元素
cout << "The first element is " << arr[0] << endl;
// 修改数组中的元素
arr[1] = 0;
// 遍历数组
for (int i = 0; i < sizeof(arr) / sizeof(int); ++i) {
cout << arr[i] << ' ';
}
cout << endl;
4.3 指针和动态内存分配
数组的名字可以被视为指向第一个元素的指针,在C++中可以使用指针来操作数组。此外,还可以使用new
运算符在动态内存中创建数组。以下是一些数组操作的示例代码:
int arr[] = {1, 2, 3, 4, 5};
// 使用指针遍历数组
for (int* p = arr; p != arr + sizeof(arr) / sizeof(int); ++p) {
cout << *p << ' ';
}
cout << endl;
// 在动态内存中创建数组
int* p = new int[5];
for (int i = 0; i < 5; ++i) {
p[i] = i + 1;
cout << p[i] << ' ';
}
cout << endl;
delete[] p;
5. 总结
字符串string、向量vector和数组都是C++中常用的数据结构,它们都有各自的优点和用途。在使用时需要根据具体的需求选择合适的数据结构。