您的位置:

C++遍历vector实践

一、 vector遍历

vector是C++语言中常用的一种容器,由于其具有快速随机访问的特性以及高效地在尾部进行添加和删除元素操作的能力,使得在实际业务开发中被广泛使用。下面给出一个简单的vector的遍历实例:

#include <iostream>
#include <vector>

int main(){
    std::vector
    vec = {1, 2, 3, 4, 5};
    for (auto& element : vec){
        std::cout << element << " ";
    }
    return 0;
}

   

在上述代码中,我们使用了一个基于范围的for循环语句来遍历vector中的所有元素,语法格式如下:

for (auto& element : vec){
    // 待执行的语句
}

其中,auto关键字会自动根据迭代器中元素的数据类型来推导element的数据类型,&符号表示以引用的方式进行遍历,以确保不会发生元素值或者指针地址的复制,提高效率。

二、遍历vector中的元素

在vector中可以存储任意数据类型的元素,如基本数据类型、自定义数据类型,甚至可以存储其他容器类型的元素,那么我们如何对存储在vector中的元素进行遍历呢?下面以存储自定义数据类型的vector为例进行讲解:

#include <iostream>
#include <vector>
#include <string>

class Person{
public:
    std::string name;
    int age;
    
    Person(std::string n, int a): name(n), age(a){}
};

int main(){
    std::vector<Person> vec;  // 定义存储Person类型元素的vector对象
    vec.push_back(Person("Tom", 20));
    vec.push_back(Person("Jack", 25));
    vec.push_back(Person("Lucy", 22));
    for (const auto& element : vec){
        std::cout << element.name << ", age:" << element.age << std::endl;
    }
    return 0;
}

在上述代码中,我们通过定义一个自定义的Person类,来存储vector中的元素,然后通过for循环进行遍历,每次访问元素时通过类中的成员变量名称进行访问。

三、C++便利vector

C++ STL库中提供了一些常用的容器访问算法,用于方便地对容器中的元素进行遍历、查找、排序等操作。下面给出一些常用的vector访问算法:

1、std::for_each:在每个容器元素上执行特定的操作

#include <iostream>
#include <vector>
#include <algorithm>

int main(){
    std::vector<int> vec = {1, 2, 3, 4, 5};
    // 对所有元素进行加3操作
    std::for_each(vec.begin(), vec.end(), [](int& n){ n += 3; });
    for (const auto& element : vec){
        std::cout << element << " ";
    }
    return 0;
}

2、std::find:在容器中查找指定元素

#include <iostream>
#include <vector>
#include <algorithm>

int main(){
    std::vector<int> vec = {1, 2, 3, 4, 5};
    // 在vector中查找元素3
    auto it = std::find(vec.begin(), vec.end(), 3);
    if (it != vec.end()){
        std::cout << "查找到元素,位置为:" << std::distance(vec.begin(), it) << std::endl;
    }
    else{
        std::cout << "未找到元素" << std::endl;
    }
    return 0;
}

3、std::sort:对容器中的元素进行排序

#include <iostream>
#include <vector>
#include <algorithm>

int main(){
    std::vector<int> vec = {15, 20, 5, 35, 10};
    // 对vector中元素进行升序排序
    std::sort(vec.begin(), vec.end());
    for (const auto& element : vec){
        std::cout << element << " ";
    }
    return 0;
}

四、C++遍历map

与vector类似,C++内置容器std::map也是常被使用的一种容器类型,其以 对的形式进行存储,那么如何遍历map中的元素呢?下面给出一个简单的遍历map实例:

#include <iostream>
#include <map>
#include <string>

int main(){
    std::map<std::string, int> mapData = {
        {"Tom", 20},
        {"Jack", 25},
        {"Lucy", 22}
    };
    for (const auto& element : mapData){
        std::cout << element.first << ": " << element.second << std::endl;
    }
    return 0;
}

在上述代码中,我们使用了基于范围的for循环语句来遍历map中的所有元素,map中的每个元素是以 对的形式存储的,因此通过访问pair类型中的成员变量first和second来获取对应元素的键和值。

五、C++遍历文件夹

在实际业务开发中,我们常常需要遍历某个目录下的所有文件,C++语言提供了一种遍历目录的方法,可以方便地获取指定目录下的所有文件和子目录列表,下面给出一个基本的遍历目录实例:

#include <iostream>
#include <filesystem>

int main(){
    std::string dirname = "C:\\data\\";  // 目录路径名
    for (const auto& entry : std::filesystem::directory_iterator(dirname)){
        std::cout << entry.path() << std::endl;
    }
    return 0;
}

在上述代码中,我们使用了C++17中提供的std::filesystem标准库,定义一个指定目录名称的字符串dirname,然后使用基于范围的for循环语句来遍历该目录下的所有文件和子目录,其中路径信息存储在std::filesystem::directory_entry对象中,可以通过调用其path()方法来获取文件或目录的完整路径。

六、C++遍历像素点

C++语言提供了处理图像的库,如OpenCV,常用于数字图像处理、计算机视觉等领域。在对图像进行处理的过程中,需要遍历图像中的每个像素,以便对其进行操作,下面给出一个简单的遍历像素点实例:

#include <iostream>
#include <opencv2/opencv.hpp>

int main(){
    // 读取图像
    cv::Mat image = cv::imread("lena.jpg");
    // 遍历图像中的每个像素
    for (int i = 0; i < image.rows; i++){
        for (int j = 0; j < image.cols; j++){
            cv::Vec3b pixel = image.at<cv::Vec3b>(i, j);  // 读取像素值
            pixel[0] = pixel[0] * 0.5;  // 对蓝色通道进行操作
            pixel[1] = pixel[1] * 0.5;  // 对绿色通道进行操作
            image.at<cv::Vec3b>(i, j) = pixel;  // 更新像素值
        }
    }
    // 展示修改后的图像
    cv::imshow("lena", image);
    cv::waitKey(0);
    return 0;
}

在上述代码中,我们使用了OpenCV库中的cv::Mat类来读取图像,然后使用双重for循环语句遍历图像中的每个像素,通过调用at()函数读取指定像素的值,并对其进行操作,最后再次调用at()函数来更新对应像素的值。

七、C++遍历数组

数组是C++语言中基本的数据结构之一,其在内存中是连续的一段数据空间,可以通过指针方式遍历其元素,下面给出一个简单的数组遍历实例:

#include <iostream>

int main(){
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(int);
    // 遍历数组中所有元素
    for (int i = 0; i < n; i++){
        std::cout << arr[i] << " ";
    }
    return 0;
}

在上述代码中,我们定义一个整型数组arr,使用for循环语句遍历该数组中的所有元素,可以使用sizeof()函数计算出数组的长度。

八、C++遍历excel

在实际业务开发中,我们常常需要对Excel表格进行操作,C++语言提供了一些第三方库来访问和处理Excel表格,如LibXL、ExcelFormat等,下面给出一个遍历Excel表格中数据的实例:

#include <iostream>
#include <libxl.h>

int main(){
    libxl::Book* book = xlCreateBook();
    if (book){
        if (book->load("data.xlsx")){
            libxl::Sheet* sheet = book->getSheet(0);
            if (sheet){
                // 获取表格行数和列数
                int rows = sheet->lastRow();
                int cols = sheet->lastCol();
                // 遍历表格中所有数据
                for (int i = 0; i < rows; i++){
                    for (int j = 0; j < cols; j++){
                        libxl::CellType type = sheet->cellType(i, j);
                        if (type == libxl::CELLTYPE_NUMBER){  // 数字类型
                            double value = sheet->readNum(i, j);
                            std::cout << value << " ";
                        }
                        else if (type == libxl::CELLTYPE_STRING){  // 字符串类型
                            std::string value = sheet->readStr(i, j);
                            std::cout << value << " ";
                        }
                    }
                    std::cout << std::endl;
                }
            }
        }
        book->release();
    }
    return 0;
}

在上述代码中,我们使用第三方库LibXL来访问指定路径下的Excel表格文件,在LibXL库中,通过xlCreateBook()函数创建一个新的工作簿,然后使用load()函数从指定文件中读取数据,再通过getSheet()函数获取Excel表格中的第一个工作表sheet,最后使用双重for循环语句遍历表格中所有数据。

九、C++遍历中文字符

在C++语言中,由于其默认使用的编码方式是ASCII码,如果需要