5.C++中的数组和Vector

C++中的数组和Vector

数组的基本使用

  • 定义与初始化
    • 静态数组:定义时指定固定大小并可同时初始化。例如int arr1[5] = {1, 2, 3, 4, 5};定义了一个包含 5 个整数的数组。也可部分初始化,如int arr2[5] = {1, 2};,未初始化的元素自动初始化为 0。
    • 动态数组:使用new关键字在堆上动态分配内存创建。如int* dynamicArr = new int[10];,需手动用delete[]释放内存,否则会内存泄漏。
  • 访问元素:通过下标运算符[]访问,下标从 0 开始。例如arr1[2]访问arr1的第 3 个元素。也可通过指针偏移,因为数组名是指向首元素的指针,*(arr1 + 2)arr1[2]等价。
  • 遍历数组
    • 普通for循环:用for循环遍历数组。示例代码如下:
#include 

int main() {
    int arr[5] = {1, 3, 5, 7, 9};
    for (int i = 0; i < 5; i++) {
        std::cout << arr[i] << " ";
    }
    return 0;
}
  • foreach循环:C++11 引入的foreach循环使遍历更简洁。示例代码如下:
#include 

int main() {
    int arr[5] = {2, 4, 6, 8, 10};
    for (int num : arr) {
        std::cout << num << " ";
    }
    return 0;
}

数组作为函数参数

  • 数组作为函数参数传递时,实际传递的是数组首地址,在函数内对数组的修改会影响原始数组。函数参数列表中声明数组参数有两种方式:void function_name(data_type array_name[])void function_name(data_type* array_name)。通常还需额外传递参数表示数组大小。示例代码如下:
#include 

void modifyArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        arr[i] *= 2;
    }
}

int main() {
    int numbers[5] = {1, 2, 3, 4, 5};
    modifyArray(numbers, 5);
    for (int i = 0; i < 5; i++) {
        std::cout << numbers[i] << " ";
    }
    return 0;
}

多维数组

  • 二维数组
    • 定义与初始化:定义语法为data_type array_name[row_size][column_size];,如int matrix[3][4];。初始化可按行优先顺序,如int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    • 访问元素:使用两个下标,如matrix[1][2]访问第二行第三列的元素。示例代码如下:
#include 

int main() {
    int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}
  • 三维及以上数组:与二维数组类似,只是多了维度。例如三维数组int cube[2][3][4];,可类比二维数组的操作方式进行定义、初始化和访问。

数组与指针的关系

  • 数组名可看作常量指针,指向数组首元素。可以将数组名赋值给指针,通过指针操作数组。示例代码如下:
#include 

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int* ptr = arr;
    for (int i = 0; i < 5; i++) {
        std::cout << *(ptr + i) << " ";
    }
    return 0;
}

在使用数组时,要注意下标越界问题,避免访问非法内存导致程序出错。同时,合理选择静态数组和动态数组,根据实际需求管理好内存。

然而,相比较C语言,C++除了给出数组供我们存储数据,还有一种更为简单易用的数据结构,叫做vector,它包含在C++的STL库中

Vector的使用

定义与初始化
  • 默认初始化:创建一个空的vector
#include 
#include 

int main() {
    std::vector<int> vec1;
    return 0;
}
  • 指定大小初始化:创建一个指定大小的vector,所有元素初始化为默认值(对于int类型是 0)。
#include 
#include 

int main() {
    std::vector<int> vec2(5);
    for (int num : vec2) {
        std::cout << num << " ";
    }
    return 0;
}
  • 指定大小和初始值初始化:创建一个指定大小的vector,并将所有元素初始化为指定值。
#include 
#include 

int main() {
    std::vector<int> vec3(5, 10);
    for (int num : vec3) {
        std::cout << num << " ";
    }
    return 0;
}
  • 使用初始化列表初始化:使用花括号括起来的初始化列表来初始化vector
#include 
#include 

int main() {
    std::vector<int> vec4 = {1, 2, 3, 4, 5};
    for (int num : vec4) {
        std::cout << num << " ";
    }
    return 0;
}
  • 从其他vector初始化:使用另一个vector来初始化新的vector
#include 
#include 

int main() {
    std::vector<int> vec5 = {1, 2, 3};
    std::vector<int> vec6(vec5);
    for (int num : vec6) {
        std::cout << num << " ";
    }
    return 0;
}
访问元素
  • 通过下标访问:与数组类似,使用[]运算符访问vector中的元素。
#include 
#include 

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::cout << "The third element is: " << vec[2] << std::endl;
    return 0;
}
  • 使用at()函数访问at()函数会进行边界检查,越界时抛出std::out_of_range异常。
#include 
#include 
#include 

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    try {
        std::cout << "The third element is: " << vec.at(2) << std::endl;
        // 尝试访问越界元素
        std::cout << "Accessing out - of - range element: " << vec.at(10) << std::endl;
    } catch (const std::out_of_range& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
    return 0;
}
  • 使用迭代器访问:迭代器是一种类似于指针的对象,用于遍历vector
#include 
#include 

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int>::iterator it;
    for (it = vec.begin(); it!= vec.end(); ++it) {
        std::cout << *it << " ";
    }
    return 0;
}
添加和删除元素
  • push_back()添加元素:在vector的末尾添加一个元素。
#include 
#include 

int main() {
    std::vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    for (int num : vec) {
        std::cout << num << " ";
    }
    return 0;
}
  • pop_back()删除元素:删除vector末尾的元素。
#include 
#include 

int main() {
    std::vector<int> vec = {1, 2, 3};
    vec.pop_back();
    for (int num : vec) {
        std::cout << num << " ";
    }
    return 0;
}
  • insert()插入元素:在指定位置插入元素。
#include 
#include 

int main() {
    std::vector<int> vec = {1, 2, 4};
    std::vector<int>::iterator it = vec.begin() + 2;
    vec.insert(it, 3);
    for (int num : vec) {
        std::cout << num << " ";
    }
    return 0;
}
  • erase()删除元素:删除指定位置或指定范围的元素。
#include 
#include 

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    // 删除第三个元素
    std::vector<int>::iterator it1 = vec.begin() + 2;
    vec.erase(it1);
    // 删除第二到第四个元素
    std::vector<int>::iterator it2 = vec.begin() + 1;
    std::vector<int>::iterator it3 = vec.begin() + 3;
    vec.erase(it2, it3);
    for (int num : vec) {
        std::cout << num << " ";
    }
    return 0;
}
其他常用操作
  • 获取大小:使用size()函数获取vector中元素的数量。
#include 
#include 

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::cout << "Size of the vector: " << vec.size() << std::endl;
    return 0;
}
  • 检查是否为空:使用empty()函数检查vector是否为空。
#include 
#include 

int main() {
    std::vector<int> vec1;
    std::vector<int> vec2 = {1};
    std::cout << "vec1 is empty: " << (vec1.empty()? "Yes" : "No") << std::endl;
    std::cout << "vec2 is empty: " << (vec2.empty()? "Yes" : "No") << std::endl;
    return 0;
}
  • 清空vector:使用clear()函数清空vector中的所有元素。
#include 
#include 

int main() {
    std::vector<int> vec = {1, 2, 3};
    vec.clear();
    std::cout << "Size after clear: " << vec.size() << std::endl;
    return 0;
}

你可能感兴趣的:(C++基础入门,c++,开发语言)