选择要插入所记录的多个db的容器

Selection of container to insert the multiple db recored

本文关键字:db 选择 插入 记录      更新时间:2023-10-16

在我当前的任务中,我需要从数据库读取读取大约10,000条记录(学生数据),并需要将其存储在容器中。现在我需要选择容器来存储所有这些记录,以便生成报告。报告生成选项是特定于供应商的,因为一个供应商希望在不排序的情况下转储所有记录,而另一个供应商希望根据排序的名称字段生成报告。我从我的结束中选择了向量,因为我不需要在中间插入任何类型的插入,并且不需要搜索第一个选项(不排序字段的报告),但对于第二个选项,任何人都可以通过引入基于名称字段的排序来建议我向量是否适合相同的选项。

下面是我在scott meyers的书(Effective STL)第23项中找到的一些有用的指针。我相信基于以下信息的第二个选择排序向量需要使用,但我仍然希望有人通过一些光在我得出任何结论,并开始编码之前。

项目23。考虑用排序向量

替换关联容器

"**标准的关联容器通常被实现为平衡二叉搜索树。平衡二叉搜索树是一种针对插入、擦除和查找的混合组合进行优化的数据结构。也就是说,它是为做一些插入,然后一些查找,然后可能再做一些插入,然后可能再做一些删除,然后再做一些查找,然后再做一些插入或删除,然后再做一些查找,等等。这个事件序列的关键特征是插入、擦除和查找都是混合的。一般来说,无法预测树的下一个操作是"

"

正如Scott Meyers所建议的那样,std::vector是存储数据和操作数据的非常好的容器-如果数据非常大-不仅是元素数量,而且元素大小也很重要。

您可以通过不操作数据本身,而是通过操作该数据的索引来减小要操作的数据的大小。

假设你已经从文件中读取了向量:

struct Element { .... };
std::vector<Element> data;
readData(someFile);

您可以通过创建这样的索引向量来生成这些记录的"自然顺序"(参见cppreference上的iota):

using indices = std::vector<std::size_t>;
indices naturalOrder(data.size());
std::iota(naturalOrder.begin(), naturalOrder.end(), 0); // filled with 0,1,2,...

使用这些索引来打印记录-定义这样的算法:

template <typename Container, typename Indices, typename Operation>
void for_erach(Container&& container, const Indices& indices, Operation&& op)
{
    for (auto i: indices) 
        op(container[i]);
} 
// print in natural order
for_each(data, naturalOrder, [] (auto const& e) { 
    std::cout << e << std::endl; 
});  

对索引进行排序:

Indices sorterdByXOrder = naturalOrder;
auto lessX = [&data](auto i, auto j) { return data[i].x < data[j].x; };
std::sort(sorterdByXOrder.begin(), sorterdByXOrder.end(), lessX);
// print in sorted by x  order
std::cout << "Sorted by x:" << std::endl;
for_each(data, sorterdByXOrder , [] (auto const& e) { 
    std::cout << e << std::endl; 
});  

只有索引,例如元素。Y == 7 -这样做:

Indices onlyY7Order;
auto yIs7 = [&data](auto i) { return data[i].y == 7; };
std::copy_if(naturalOrder.begin(), naturalOrder.end(),
          std::back_inserter(onlyY7Order),  yIs7);

如果将整个数据读取到std::vector会有性能问题-您可以尝试使用std::deque -在某些情况下它可能更快。我给出的其余代码不会改变—因为std::dequestd::vector具有非常相似的接口…