在 C++ 编程中,vector
容器是一种非常强大且常用的数据结构。它提供了动态数组的功能,能够自动管理内存,并且具有高效的随机访问和插入、删除操作。本文将深入探讨 C++ 中的vector
容器,突出关键要点,并通过丰富的示例和讲解,帮助你更好地理解和运用vector
容器。
一、vector
容器简介
vector
是 C++ 标准模板库(STL)中的一种序列容器,它实现了动态数组的功能。vector
可以存储任意类型的元素,并且可以根据需要自动调整其大小。它提供了高效的随机访问、插入和删除操作,并且支持迭代器访问。
二、关键要点
(一)动态大小
-
vector
容器的大小可以在运行时动态调整。当向vector
中添加元素时,如果当前的容量不足以容纳新元素,vector
会自动分配更大的内存空间,并将现有元素复制到新的内存空间中。 -
可以使用
push_back
函数向vector
中添加元素,vector
会自动调整其大小以容纳新元素。例如:#include <iostream> #include <vector> int main() { std::vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); for (int i : v) { std::cout << i << " "; } return 0; }
-
可以使用
resize
函数来调整vector
的大小。如果新的大小大于当前的大小,vector
会自动添加默认构造的元素来填充新的空间。如果新的大小小于当前的大小,vector
会删除多余的元素。例如:#include <iostream> #include <vector> int main() { std::vector<int> v{1, 2, 3}; v.resize(5); for (int i : v) { std::cout << i << " "; } return 0; }
(二)随机访问
-
vector
支持高效的随机访问,可以通过下标运算符[]或at函数来访问vector
中的元素。例如:#include <iostream> #include <vector> int main() { std::vector<int> v{1, 2, 3}; std::cout << v[1] << std::endl; std::cout << v.at(2) << std::endl; return 0; }
-
注意,使用下标运算符访问
vector
中的元素时,如果下标越界,可能会导致未定义的行为。而使用at
函数访问元素时,如果下标越界,会抛出std::out_of_range
异常。
(三)迭代器访问
-
vector
支持迭代器访问,可以使用迭代器来遍历vector
中的元素。迭代器提供了一种统一的方式来访问不同类型的容器中的元素,并且可以与算法库中的函数一起使用。 -
可以使用
begin
和end
函数来获取vector
的迭代器范围。例如:#include <iostream> #include <vector> int main() { std::vector<int> v{1, 2, 3}; for (auto it = v.begin(); it!= v.end(); ++it) { std::cout << *it << " "; } return 0; }
-
还可以使用
rbegin
和rend
函数来获取反向迭代器,用于反向遍历vector
中的元素。例如:#include <iostream> #include <vector> int main() { std::vector<int> v{1, 2, 3}; for (auto it = v.rbegin(); it!= v.rend(); ++it) { std::cout << *it << " "; } return 0; }
(四)插入和删除操作
-
vector
提供了多种插入和删除元素的方法。可以使用push_back
和pop_back
函数在vector
的末尾添加和删除元素。例如:#include <iostream> #include <vector> int main() { std::vector<int> v{1, 2, 3}; v.push_back(4); v.pop_back(); for (int i : v) { std::cout << i << " "; } return 0; }
-
可以使用
insert
函数在vector
的任意位置插入元素。例如:#include <iostream> #include <vector> int main() { std::vector<int> v{1, 2, 3}; v.insert(v.begin() + 1, 4); for (int i : v) { std::cout << i << " "; } return 0; }
-
可以使用
erase
函数删除vector
中的元素。例如:#include <iostream> #include <vector> int main() { std::vector<int> v{1, 2, 3}; v.erase(v.begin() + 1); for (int i : v) { std::cout << i << " "; } return 0; }
-
注意,插入和删除操作可能会导致
vector
的迭代器失效。在进行插入和删除操作后,需要重新获取迭代器。
(五)内存管理
-
vector
自动管理内存,当向vector
中添加元素时,如果当前的容量不足以容纳新元素,vector
会自动分配更大的内存空间,并将现有元素复制到新的内存空间中。当删除元素时,vector
可能会释放一些内存空间,以减少内存占用。 -
可以使用
capacity
函数来获取vector
当前的容量,使用reserve
函数来预先分配一定的内存空间,以避免频繁的内存分配和复制操作。例如:#include <iostream> #include <vector> int main() { std::vector<int> v; std::cout << "Initial capacity: " << v.capacity() << std::endl; v.reserve(10); std::cout << "Capacity after reserve: " << v.capacity() << std::endl; for (int i = 0; i < 10; ++i) { v.push_back(i); } std::cout << "Capacity after push_back: " << v.capacity() << std::endl; return 0; }
三、实际应用场景
(一)存储动态数据
当需要存储动态大小的数据时,可以使用vector容器。例如,存储用户输入的数据、从文件中读取的数据等。
#include <iostream>
#include <vector>
int main() {
std::vector<int> data;
int input;
std::cout << "Enter numbers (enter -1 to stop): ";
while (true) {
std::cin >> input;
if (input == -1) {
break;
}
data.push_back(input);
}
for (int i : data) {
std::cout << i << " ";
}
return 0;
}
(二)算法实现
vector
容器可以与算法库中的函数一起使用,实现各种算法。例如,使用std::sort
函数对vector
中的元素进行排序。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v{3, 1, 4, 1, 5, 9, 2, 6, 5};
std::sort(v.begin(), v.end());
for (int i : v) {
std::cout << i << " ";
}
return 0;
}
(三)函数参数传递
可以将vector
作为函数的参数传递,实现函数对动态数据的操作。例如,编写一个函数来计算vector
中元素的和。
#include <iostream>
#include <vector>
int sum(const std::vector<int>& v) {
int s = 0;
for (int i : v) {
s += i;
}
return s;
}
int main() {
std::vector<int> v{1, 2, 3, 4, 5};
std::cout << "Sum of elements: " << sum(v) << std::endl;
return 0;
}
四、总结
C++ 的vector
容器是一种非常强大且常用的数据结构,它提供了动态数组的功能,能够自动管理内存,并且具有高效的随机访问和插入、删除操作。通过理解vector
容器的关键要点,你可以更好地应用它来解决各种编程问题。在实际应用中,你可以根据具体的需求选择合适的数据结构,并结合算法库中的函数实现高效的编程。