📜  C++ 中的多组对与示例(1)

📅  最后修改于: 2023-12-03 15:13:58.685000             🧑  作者: Mango

C++ 中的多组对

在C++中,多组对是一种常用的数据结构。它可以将多个值保存在一起,并提供快速访问和搜索功能。

定义和初始化

C++中的多组对可以使用std::pairstd::tuple两种方式来定义和初始化。

std::pair

std::pair是一种包含两个值的数据结构。可以使用以下方法来定义和初始化:

#include <iostream>
#include <utility>

int main () {
    // 初始化一个整型pair
    std::pair<int, int> pair1 = std::make_pair(1, 2);
    std::cout << "pair1: " << pair1.first << " " << pair1.second << std::endl;

    // 直接初始化一个字符型pair
    std::pair<char, char> pair2('a', 'b');
    std::cout << "pair2: " << pair2.first << " " << pair2.second << std::endl;

    // 使用auto进行类型推导初始化
    auto pair3 = std::make_pair(3.14, "hello");
    std::cout << "pair3: " << pair3.first << " " << pair3.second << std::endl;

    return 0;
}

输出:

pair1: 1 2
pair2: a b
pair3: 3.14 hello
std::tuple

std::tuple是一种包含任意数量值的数据结构。可以使用以下方法来定义和初始化:

#include <iostream>
#include <tuple>
#include <string>

// 可以使用结构体来定义tuple类型
struct Student {
    std::string name;
    int age;
};

int main () {
    // 初始化一个包含3个值的tuple
    std::tuple<int, double, std::string> tuple1(1, 3.14, "hello");
    std::cout << "tuple1: " << std::get<0>(tuple1) << " " << std::get<1>(tuple1) << " " << std::get<2>(tuple1) << std::endl;

    // 使用auto进行类型推导初始化
    auto tuple2 = std::make_tuple(10, "world", Student{"Tom", 20});
    std::cout << "tuple2: " << std::get<0>(tuple2) << " " << std::get<1>(tuple2) << " " << std::get<2>(tuple2).name << " " << std::get<2>(tuple2).age << std::endl;

    return 0;
}

输出:

tuple1: 1 3.14 hello
tuple2: 10 world Tom 20
多组对的使用

使用多组对可以方便地进行元素搜索、排序、去重等操作。以下是几个常见应用场景:

1. 数组排序

可以使用std::pair将数组的值与下标保存在一起,然后对pair进行排序。如下:

#include <iostream>
#include <utility>
#include <algorithm>

bool cmp(const std::pair<int, int>& a, const std::pair<int, int>& b) {
    return a.first < b.first;
}

int main () {
    int arr[] = {3, 2, 1, 5, 4};
    int n = sizeof(arr) / sizeof(arr[0]);

    // 使用pair保存下标和数组元素
    std::pair<int, int> pairArr[n];
    for (int i = 0; i < n; i++) {
        pairArr[i] = std::make_pair(arr[i], i);
    }

    // 对pair排序
    std::sort(pairArr, pairArr + n, cmp);

    // 输出排序结果
    for (int i = 0; i < n; i++) {
        std::cout << arr[pairArr[i].second] << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

1 2 3 4 5
2. 元素去重

可以使用std::set来保存元素,通过定义std::pairoperator<可以自动去重。如下:

#include <iostream>
#include <set>
#include <utility>

int main () {
    int arr[] = {1, 2, 3, 3, 4, 4, 5};
    int n = sizeof(arr) / sizeof(arr[0]);

    // 使用set保存去重后的元素
    std::set<std::pair<int, bool>> s;
    for (int i = 0; i < n; i++) {
        s.insert(std::make_pair(arr[i], true));
    }

    // 输出去重后的元素
    for (auto it : s) {
        std::cout << it.first << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

1 2 3 4 5
3. 元素搜索

可以使用std::vector来保存多组对元素,并使用STL提供的搜索等算法进行操作。如下:

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

int main () {
    std::vector<std::pair<std::string, int>> vec = {
        std::make_pair("apple", 10),
        std::make_pair("banana", 20),
        std::make_pair("orange", 30)
    };

    // 查找元素
    auto it = std::find_if(vec.begin(), vec.end(), [](const std::pair<std::string, int>& a){
        return a.first == "banana";
    });

    if (it != vec.end()) {
        std::cout << "Found value: " << it->second << std::endl;
    } else {
        std::cout << "Value not found." << std::endl;
    }

    return 0;
}

输出:

Found value: 20
总结

在C++中,多组对是一种非常有用的数据结构,可以优化代码的可读性和效率。std::pairstd::tuple是常用的定义方式,在实际使用中需要根据具体场景进行选择。