我想支持带索引的对象列表。例如:
struct customer
{
string first_name;
string last_name;
Color favorite_color;
};
template <typename T>
class indexed_list
{
// ...
}
indexed_list<customer> allCustomers;
// ...populate the list...
list<customer> customersNamedBob = allCustomers.get_first_name("Bob");
list<customer> customersThatLikeRed = allCustomers.get_color(Colors.Red);
当然,选项是使用SQLLite或类似的东西,但假设我想使用简单的c ++数据结构来实现这一点,我该怎么做呢?或者,什么是免费的?
我的计划是将数据存储为list<T>
,然后将一系列[unordered_]map<IdxT, list<T>::iterator>
绑定到实际值的索引。可以理解的是,为任何类型T
制作这个通用都有点痛苦,所以也许会有一些逻辑进入customer_list
类,使用indexed_list
基础内的辅助工具类,或类似的东西。想法?
答案 0 :(得分:1)
在boost :: multiindex
中提供战利品http://www.boost.org/doc/libs/1_65_1/libs/multi_index/doc/index.html
答案 1 :(得分:0)
如果你最终只使用了一些索引组合,那么你最好在需要的时候生成它们。
std::list<Customer> customersNamedBob;
std::copy_if(std::begin(listOfAllCustomers), std::end(listOfAllCustomers),
std::back_inserter(customersNamedBob),
[](const Customer& c) { return !c.name.compare("Bob"); });
将逻辑封装在函数中以使其更漂亮并且您已准备好
template <class Fn>
list<Customer> query(const list<Customer>& table, Fn fn) {
std::list<Customer> result;
std::copy_if(std::begin(listOfAllCustomers), std::end(listOfAllCustomers),
std::back_inserter(customersNamedBob),
[](const Customer& c) { return fn(c); });
然后:
customersNamedBob = query(listofAllCustomers, [](const Customer&c) { ... });
如果速度确实是关键,您可以使用不同的方式对多个std::list<Customer*>
进行排序,然后使用std::lower_bound
+ std::upper_bound
来回答查询。它与sql数据库的功能没有什么不同。