gpt4 book ai didi

c++ - 如何使用 STL 和/或 Boost 在 C++ 中模拟 SQL 连接

转载 作者:太空狗 更新时间:2023-10-29 20:30:38 25 4
gpt4 key购买 nike

如何使用 C++ 模拟两个动态数据集(即在运行时获取数据)之间的 SQL 连接。
示例表 A 是学生、他们的姓名和类(class)编号的二维 vector (任何 STL 或 Boost 数据结构都可以)。表 B 是 vector 的二维 vector (任何 STL 或 Boost 数据结构都可以)类(class)编号、描述和房间号

//Table A
// Columns: StudentID FirstName LastName CourseNum
std::vector<std::string> a1 = boost::assign::list_of("3490")( "Saundra")( "Bribiesca")( "F100X");
std::vector<std::string> a2 = boost::assign::list_of("1288")( "Guy")( "Shippy")( "F103X");
std::vector<std::string> a3 = boost::assign::list_of("5383")( "Tia")( "Roache")( "F103X");
std::vector<std::string> a4 = boost::assign::list_of("5746")( "Jamie")( "Grunden")( "F101X");
std::vector<std::string> a5 = boost::assign::list_of("2341")( "Emilia")( "Hankinson")( "F120X");

std::vector<std::vector<std::string > > TableA = boost::assign::list_of(a1)(a2)(a3)(a4)(a5);

//Table B
//Columns: CourseNum CourseDesc Room
std::vector<std::string> b1 = boost::assign::list_of("F100X")("Human Biology")("400B");
std::vector<std::string> b2 = boost::assign::list_of("F103X")("Biology and Society")("500B");
std::vector<std::string> b3 = boost::assign::list_of("F101X")("The Dynamic Earth 340A");
std::vector<std::string> b4 = boost::assign::list_of("F120X")("Glaciers, Earthquakes and Volcanoes")("300C");Earthquakes and Volcanoes");


std::vector<std::vector<std::string > > TableB = boost::assign::list_of(b1)(b2)(b3)(b4);

//Table C ( result of joining A and B ) using TableA[3] and TableB[0] as key
//I want to produce a resultset Table C, like this


Table CStudentID   FirstName   LastName    Room    CourseNum   CourseDesc3490    Saundra Bribiesca   400B    F100X   Human Biology1288    Guy Shippy  500B    F103X   Biology and Society5383    Tia Roache  500B    F103X   Biology and Society5746    Jamie   Grunden 340A    F101X   The Dynamic Earth2341    Emilia  Hankinson    300C   F120X   Glaciers, Earthquakes and Volcanoes

最佳答案

SQL 引擎使用各种不同的技术来执行连接,这取决于可用的索引(或者它认为应该即时创建的哈希表)。

最简单的方法是对两个表进行 O(N*M) 嵌套循环。因此,要进行内部联接,您需要比较每一对元素,一个来自 A,一个来自 B。当您看到匹配项时,输出一行。

如果您需要加快速度,在这种情况下,您可以在表 B 的第一列创建一个“索引”,即以第一列为键的 std::multimap ,以及其余列的元组 [*] 作为值。然后对于 A 中的每一行,在索引中查找它的第三列并为每个匹配项输出一行。如果 CourseNum 在表 B 中是唯一的,这看起来很合理,那么您可以使用 map 而不是 multimap

无论哪种方式都可以让你从 O(N*M)O((N+M)*logM),这是一个改进,除非 N(的大小表 A) 非常小。如果你的大学的学生人数比类(class)少得多,那就大错特错了;-)

[*] 我所说的“元组”是指任何包含所有值的东西 - 你一直在使用 vector ,这就可以了。

关于c++ - 如何使用 STL 和/或 Boost 在 C++ 中模拟 SQL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6385804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com