C++与Javascript的对比篇(二)

发布时间:2024年01月16日

一、C++的vector是什么

C++的vector是C++标准库中的一个容器类,用于存储和操作动态数组。它提供了一系列方便的方法来管理数组的大小和元素的访问。

二、常用的Vector的操作

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] << " ";
    }
  • 使用范围基础的for循环遍历
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::vectorJavaScript 数组
动态数组
索引访问
迭代器访问
大小可变,但在声明时可以指定初始大小可变
内存管理自动内存管理(元素会在超出范围时自动删除)手动内存管理(需要手动删除元素)
初始化方式多种初始化方式(直接初始化、列表初始化等)多种初始化方式(字面量、构造函数等)
函数和方法提供一系列函数和方法来操作和查询数组(如push_back(),?pop_back(),?insert(),?erase(),?resize(),?empty()等)提供一系列内置方法和函数来操作数组(如push(),?pop(),?shift(),?unshift(),?splice(),?slice(),?length等)
范围和边界检查无内置范围检查,需要手动处理越界问题在尝试访问超出其长度的索引时会抛出错误,有一定的边界检查
性能对于基本类型操作可能更快,因为可以进行低级别的优化对于小对象操作可能更快,因为不需要进行内存分配和释放操作

文章来源:https://blog.csdn.net/IDdaxia/article/details/135605550
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。