📅  最后修改于: 2023-12-03 15:13:58.685000             🧑  作者: Mango
在C++中,多组对是一种常用的数据结构。它可以将多个值保存在一起,并提供快速访问和搜索功能。
C++中的多组对可以使用std::pair
和std::tuple
两种方式来定义和初始化。
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
是一种包含任意数量值的数据结构。可以使用以下方法来定义和初始化:
#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
使用多组对可以方便地进行元素搜索、排序、去重等操作。以下是几个常见应用场景:
可以使用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
可以使用std::set
来保存元素,通过定义std::pair
的operator<
可以自动去重。如下:
#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
可以使用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::pair
和std::tuple
是常用的定义方式,在实际使用中需要根据具体场景进行选择。