两表进行左连接,两表各选择前两列作为键值,使用c++20的ranges及结构体,重新生成对应C++代码
以下是使用C++20的ranges和结构体实现左连接的代码:
#include <iostream>
#include <vector>
#include <ranges>
#include <algorithm>
struct Table1 {
int key1;
int key2;
std::string value;
};
struct Table2 {
int key1;
int key2;
double value;
};
int main() {
std::vector<Table1> table1{{1, 2, "foo"}, {3, 4, "bar"}, {5, 6, "baz"}};
std::vector<Table2> table2{{1, 2, 1.23}, {5, 6, 4.56}, {7, 8, 7.89}};
auto joined = table1 | std::views::join(table2)
| std::views::filter([](auto const& pair) { return pair.first.key1 == pair.second.key1 && pair.first.key2 == pair.second.key2; })
| std::views::transform([](auto const& pair) { return std::make_tuple(pair.first.key1, pair.first.key2, pair.first.value, pair.second.value); });
std::cout << "key1\tkey2\tvalue1\tvalue2\n";
std::ranges::for_each(joined, [](auto const& tuple) {
std::cout << std::get<0>(tuple) << "\t" << std::get<1>(tuple) << "\t" << std::get<2>(tuple) << "\t" << std::get<3>(tuple) << "\n";
});
return 0;
}
该代码将表1和表2进行左连接,使用前两列作为键值。在连接时,使用std::views::join将两个表合并为一个元素类型为std::pair<Table1, Table2>的视图。然后使用std::views::filter筛选出满足键值相等的元素,并使用std::views::transform将元素转换为键1、键2、表1的值和表2的值构成的四元组。最后使用std::ranges::for_each输出结果。
原文地址: https://www.cveoy.top/t/topic/vRT 著作权归作者所有。请勿转载和采集!