选择要插入所记录的多个db的容器
Selection of container to insert the multiple db recored
在我当前的任务中,我需要从数据库读取读取大约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::deque
和std::vector
具有非常相似的接口…
- 如何使用默认参数等选择模板专业化
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 选择要调用的构造函数
- C++选择排序算法中的逻辑错误
- QTreeView幻灯片多选后无法使用单击选择
- 无法获取菜单选择以运行函数.C++
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 在C++中,如何通过几种类型从元组中选择多个元素
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 对可变参数使用声明.如何选择正确的功能
- 选择选举获胜者的程序
- 如何选择在 csv 文件中输出的位置
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 选择和修改嵌套向量中的条目的最佳实践
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 在运行时选择父类的实现
- 数数并选择 sqlite 中的前三名
- 选择要插入所记录的多个db的容器