如何获得具有多个索引的对象列表?

时间:2017-11-22 08:00:10

标签: c++

我想支持带索引的对象列表。例如:

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基础内的辅助工具类,或类似的东西。想法?

2 个答案:

答案 0 :(得分:1)

答案 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数据库的功能没有什么不同。