2017-11-22 7 views
-1

インデックス付きのオブジェクトのリストをサポートしたいと思います。だから、例えば:複数のインデックスを持つオブジェクトのリストを表示するにはどうすればよいですか?

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の汎用を作ることはちょっと苦しいので、indexed_list基本クラスの内部のヘルパーユーティリティを使用するか、そのようなものになるcustomer_listクラスに入るロジックがあるかもしれません。思考?

+0

'map *'の場合はどうなりますか? – alseether

+0

'find_if'はうまくいきますが、' list'のためにリストの各オブジェクトを訪問する必要があります。長いリストの場合、かなり遅くなります。 'set'などを使用すると、基本的に単一の要素に索引付けされますが、もっと必要な場合があります。間違いなく、すべてのフィールドにインデックスを付ける場合があります。 'map >'(私はあなたがこれを意味していたと仮定します)実際には単一の積分フィールドのインデックスを作成するでしょうし、基本的に私が示唆しているのは、単一のインタフェースにカプセル化されています。 – Rollie

答えて

1

はブーストで戦利品を与える::マルチインデックス

http://www.boost.org/doc/libs/1_65_1/libs/multi_index/doc/index.html

+0

これは最高の答えだと思います。悲しいことに、私の現在の雇用主は、そうでないと確信させるために最善の努力をしているにもかかわらず、その使用を許可していないので、私はちょっと理にかなったものに代わるものを探しています。 – Rollie

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データベースとは異なります。

関連する問題