C++的vector是C++标准库中的一个容器类,用于存储和操作动态数组。它提供了一系列方便的方法来管理数组的大小和元素的访问。
1.创建和初始化vector
std::vector<int> vec; // 创建一个空的整数向量
std::vector<int> vec(10); // 创建一个包含10个默认值的整数向量
std::vector<int> vec{1,2,3,4}; // 初始化向量,使用花括号
2.添加元素
vec.push_back(5); // 在向量的末尾添加一个元素
vec.insert(vec.begin(), 0); // 在向量的开始处插入一个元素
vec.push_front(10); // 在向量的开头插入一个新元素{10}
vec.push_front(20); // 在向量的开头插入一个新元素 {20, 10}
3.删除元素
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.pop_back(); // 删除向量的最后一个元素,现在 vec = {1,2, 3, 4}
vec.erase(vec.begin()); // 删除向量的第一个元素,现在 vec = {2, 3, 4, 5}
vec.erase(vec.begin() + 2); // 删除第三个元素,现在 vec = {1, 2, 4, 5}
vec.erase(vec.begin() + 1, vec.begin() + 4); // 删除第二个到第五个元素,现在 vec = {1, 3, 4}
vec.clear(); // 清空向量,现在 vec 是空的
4.访问元素
int first = vec[0]; // 通过索引访问元素
int last = vec.back(); // 通过调用back()方法访问最后一个元素
int element = vec.at(0); // 使用at()方法访问元素,会进行边界检查
5.修改元素
vec[0] = 10; // 修改第一个元素的值
vec.front() = 20; // 修改第一个元素的值
6.遍历元素
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << ' '; // 输出每个元素的值
}
// 使用for循环遍历
for (int i = 0; i < vec.size(); ++i) {
std::cout << vec[i] << " ";
}
std::vector<int> vec = {1, 2, 3, 4, 5};
for (const auto &elem : vec) {
std::cout << elem << ' '; // 输出每个元素的值
}
std::vector<int> vec = {1, 2, 3, 4, 5};
for (const auto &elem : vec.rbegin() + 1) { // 注意:rbegin() + 1 是从最后一个元素开始反向遍历的起始位置。
std::cout << elem << ' '; // 从尾部开始输出每个元素的值
}
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.rbegin(); it != vec.rend(); ++it) {
std::cout << *it << ' '; // 从尾部开始输出每个元素的值
}
7.获取大小和容量
int size = vec.size(); // 获取vector中元素的个数
int size=vec.count();// 获取vector中元素的个数
int capacity = vec.capacity(); // 获取vector当前的容量
?8.swap交换元素
#include <iostream>
int main() {
int a = 5;
int b = 10;
std::cout << "Before swap: a = " << a << ", b = " << b << std::endl;
// 使用 std::swap 函数交换 a 和 b 的值
std::swap(a, b);
std::cout << "After swap: a = " << a << ", b = " << b << std::endl;
return 0;
}
输出:
Before swap: a = 5, b = 10
After swap: a = 10, b = 5
9.sort元素排序
std::vector<int> numbers = {5, 2, 8, 1, 9};
std::sort(numbers.begin(), numbers.end()); //1 2 3 5 8 9
10.find找到元素
#include <iostream>
#include <vector>
#include <algorithm> // for std::find
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
auto it = std::find(numbers.begin(), numbers.end(), 3);
if (it != numbers.end()) {
std::cout << "Found: " << *it << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
return 0;
}
//输出:Found: 3
11.resize改变数组大小
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec;
vec.resize(5); // vec 现在有 5 个元素,值未定义
for (int i : vec) {
std::cout << i << " "; // 输出可能是任何值
}
std::cout << std::endl;
vec.resize(10, 100); // vec 现在有 10 个元素,所有元素的值都是 100
for (int i : vec) {
std::cout << i << " "; // 输出:100 100 100 100 100 100 100 100 100 100
}
std::cout << std::endl;
vec.resize(3); // vec 现在有 3 个元素,值未定义
for (int i : vec) {
std::cout << i << " "; // 输出可能是任何值
}
std::cout << std::endl;
return 0;
}
三、Javascript操作数组的方法
1.push()向数组的末尾添加一个或更多元素,并返回新的长度。
let arr = [1, 2, 3];
arr.push(4); // arr 现在是 [1, 2, 3, 4]
?2.pop() - 删除并返回数组的最后一个元素
let arr = [1, 2, 3, 4];
arr.pop(); // arr 现在是 [1, 2, 3]
?3.shift() - 删除并返回数组的第一个元素
let arr = [1, 2, 3, 4];
arr.shift(); // arr 现在是 [2, 3, 4]
4.unshift() - 向数组的开头添加一个或更多元素,并返回新的长度
let arr = [2, 3, 4];
arr.unshift(1); // arr 现在是 [1, 2, 3, 4]
5.slice() - 提取数组的一部分,并在新的数组对象中返回被提取的部分。
let arr = [1, 2, 3, 4, 5];
let newArr = arr.slice(1, 3); // 接受两个参数,起始索引和结束索引(不包括结束索引),newArr 是 [2, 3]
6.splice() - 通过删除或替换现有元素或者添加新元素来修改数组,并返回被修改的元素
let arr = [1, 2, 3, 4];
arr.splice(2, 0, 'a', 'b'); // arr 是 [1, 2, 'a', 'b', 4]
?7.sort() - 对数组的元素进行排序,并返回数组。
let arr = [5, 3, 4, 1, 2];
arr.sort(); // arr 是 [1, 2, 3, 4, 5]
8.reverse() - 颠倒数组中元素的顺序,并返回数组
let arr = [1, 2, 3];
arr.reverse(); // arr 是 [3, 2, 1]
9.filter() - 通过指定函数实现的测试,创建一个新的数组,包含通过测试的所有元素
let arr = [1, 2, 3, 4];
let newArr = arr.filter(x => x > 2); // newArr 是 [3, 4]
C++?std::vector | JavaScript 数组 | |
---|---|---|
动态数组 | 是 | 是 |
索引访问 | 是 | 是 |
迭代器访问 | 是 | 是 |
大小 | 可变,但在声明时可以指定初始大小 | 可变 |
内存管理 | 自动内存管理(元素会在超出范围时自动删除) | 手动内存管理(需要手动删除元素) |
初始化方式 | 多种初始化方式(直接初始化、列表初始化等) | 多种初始化方式(字面量、构造函数等) |
函数和方法 | 提供一系列函数和方法来操作和查询数组(如push_back() ,?pop_back() ,?insert() ,?erase() ,?resize() ,?empty() 等) | 提供一系列内置方法和函数来操作数组(如push() ,?pop() ,?shift() ,?unshift() ,?splice() ,?slice() ,?length 等) |
范围和边界检查 | 无内置范围检查,需要手动处理越界问题 | 在尝试访问超出其长度的索引时会抛出错误,有一定的边界检查 |
性能 | 对于基本类型操作可能更快,因为可以进行低级别的优化 | 对于小对象操作可能更快,因为不需要进行内存分配和释放操作 |