关于标准库类型vector:定义和初始化vector对象的方式有哪些
-
默认初始化:创建一个空的
vector
std::vector<int> v1;
-
初始化指定数量的相同默认值元素:
std::vector<int> v2(5); // 包含 5 个默认值为 0 的整数
-
初始化指定数量的指定值元素:
std::vector<int> v3(5, 10); // 包含 5 个值为 10 的整数
-
用列表初始化:
std::vector<int> v4{1, 2, 3, 4, 5};
-
复制初始化:
std::vector<int> v5 = {6, 7, 8, 9, 10};
-
从另一个
vector
初始化:std::vector<int> v6(v4); // 复制 v4 初始化 v6
-
使用迭代器范围初始化:
int arr[] = {11, 12, 13}; std::vector<int> v7(std::begin(arr), std::end(arr));
向vector对象中添加元素的方式有哪些
-
使用
push_back
函数:这是最常见的方式,在vector
的末尾添加一个元素。std::vector<int> vec; vec.push_back(10);
-
使用
insert
函数:可以在指定位置插入一个或多个元素。std::vector<int> vec2 = {1, 2, 3}; vec2.insert(vec2.begin() + 1, 5); // 在索引为 1 的位置插入 5
也可以插入多个相同元素:
vec2.insert(vec2.begin() + 1, 3, 7); // 在索引为 1 的位置插入 3 个 7
或者插入一段范围内的元素:
std::vector<int> other = {8, 9, 10}; vec2.insert(vec2.begin() + 1, other.begin(), other.end()); // 插入另一个 `vector` 的一段元素
关于迭代器在string和vector类库中的语法介绍、使用、运算
迭代器在 string
和 vector
中的语法:
对于 vector
:
std::vector<int> vec = {10, 20, 30, 40, 50};
// 声明普通迭代器
std::vector<int>::iterator vecIt;
// 声明常量迭代器,不能通过它修改元素值
std::vector<int>::const_iterator vecConstIt;// 对于反向迭代器
std::vector<int>::reverse_iterator vecRevIt;
// 常量反向迭代器
std::vector<int>::const_reverse_iterator vecConstRevIt;
对于 string
:
std::string str = "hello world";
// 普通迭代器
std::string::iterator strIt;
// 常量迭代器
std::string::const_iterator strConstIt;// 反向迭代器
std::string::reverse_iterator strRevIt;
// 常量反向迭代器
std::string::const_reverse_iterator strConstRevIt;
迭代器的使用:
以 vector
为例:
for (vecIt = vec.begin(); vecIt!= vec.end(); ++vecIt) {std::cout << *vecIt << " "; // 输出当前元素
}
std::cout << std::endl;// 使用反向迭代器从后往前遍历
for (vecRevIt = vec.rbegin(); vecRevIt!= vec.rend(); ++vecRevIt) {std::cout << *vecRevIt << " ";
}
std::cout << std::endl;
对于 string
:
for (strIt = str.begin(); strIt!= str.end(); ++strIt) {std::cout << *strIt; // 输出当前字符
}
std::cout << std::endl;// 使用反向迭代器
for (strRevIt = str.rbegin(); strRevIt!= str.rend(); ++strRevIt) {std::cout << *strRevIt;
}
std::cout << std::endl;
迭代器的运算:
-
递增和递减:
- 普通迭代器和反向迭代器都支持
++
(向前或向后移动一个位置)和--
(向前或向后移动一个位置)操作。 - 对于普通迭代器
++
使其指向容器中的下一个元素,--
使其指向上一个元素。 - 对于反向迭代器,
++
使其指向前一个元素,--
使其指向后一个元素。
- 普通迭代器和反向迭代器都支持
-
解引用:
- 通过
*
操作符可以获取迭代器当前指向的元素的值。 - 例如,对于
vector<int>::iterator it;
,*it
就是当前指向的整数。
- 通过
-
比较:
- 可以使用
==
、!=
、<
、<=
、>
、>=
等比较操作符来比较两个迭代器。 - 通常用于判断迭代器是否到达容器的开头、结尾,或者确定两个迭代器的相对位置。
- 可以使用
在使用迭代器时,一定要小心处理边界情况,避免出现越界访问等错误。
string和vector类库中的成员函数begin()和end()
在 vector
和 string
中,begin()
和 end()
是非常重要的成员函数。
begin()
函数:
- 返回一个迭代器,指向容器的第一个元素。
- 对于
vector
,如果容器为空,返回的迭代器和end()
返回的迭代器相同,都表示 “超出末端的位置”。 - 对于
string
,即使字符串为空,begin()
也会返回一个有效的迭代器,但解引用此迭代器是未定义行为。
end()
函数:
- 返回一个迭代器,指向容器 “最后一个元素的下一个位置”,这个位置被视为超出容器末端的位置。
- 不能对这个迭代器进行解引用操作,它主要用于在循环中判断是否已经遍历完整个容器。
以 vector<int> vec = {1, 2, 3};
为例:
vec.begin()
会返回一个指向1
的迭代器。vec.end()
会返回一个指向3
后面的位置的迭代器。
对于 string str = "hello";
:
str.begin()
会返回一个指向h
的迭代器。str.end()
会返回一个指向字符串结束位置(即'\0'
字符的位置)之后的迭代器。
在使用 begin()
和 end()
配合迭代器进行循环时,通常的循环条件是 it!= vec.end()
或者 it!= str.end()
,以确保在到达容器末尾时停止循环操作。