4

次のことができるSTLコンテナが必要です。

1)ユニークなアイテムのみを保存する

2)アイテムがコンテナに追加された時期に基づいて注文が保証されている

したがって、アイテムA、B、Cをこの順序でコンテナに追加すると、

Aは常に次の方法でアクセスできます:myItems().begin()またはmyItems[0]

Bは常に次の方法でアクセスできます: myItems.begin() + 1またはmyItems[1]

Cは常に次の方法でアクセスできます: myItems.begin() + 2またはmyItems[2]

私は現在、unordered_setニーズ#2を満たさないを使用しています。通常setのを使用する場合、注文に小なり関数を指定できますが、新しいアイテムがコンテナに追加されると、注文が変更される場合があります。

通常setのを使用して、A未満の新しいアイテムDを挿入すると、からAにアクセスできなくなりますmyItems.begin()。私は間違っている可能性がありますが、それはセットの順序付けがどのように機能するかについての私の理解です。

を使用する場合、すべての新しいアイテムを挿入した後listに呼び出すことで、独自の側面を適用できます。list::unique()

myList.sort();
myList.unique();

std::findまたは、リストまたはベクトルで使用して、独自の側面を手動で適用することもできます。

iter = std::find(myList.begin(), myList.end(), item);

//Only add item if not already in list/vector...
if(iter == myList.end())
{
    myList.push_back(item);
}

私の特定のニーズに適したより良いコンテナ/ソリューションはありますか?

4

2 に答える 2

3

STLにはそのようなコンテナーはありませんが、順序付けのためにstd::set/ std::unordered_set(一意性をチェックするため)とstd::deque(または他のシーケンスコンテナー)を混合することにより、既存のコンテナーでコンテナーを実装できます。

Boostにはマルチインデックスコンテナがあり、それを使用して調べたい場合は、すでにこれを実行しています。

于 2012-11-26T20:21:19.667 に答える
0

その場合は、std ::vectorまたはstd::dequeを使用することをお勧めします。std :: listは、インデックスで要素にアクセスする必要があるため、適切なソリューションではありません(リストは、この操作でO(n)の複雑さを持っています)。std :: dequeは、チャンクでメモリを管理するため、インデックスアクセスのベクトルよりも多少遅くなる可能性があります。ただし、挿入が頻繁に/散在している場合は、dequeの方が適している可能性があります。

要素が追加された順序を保持する必要がある場合は、並べ替え/一意化を行うことはできません。したがって、このタスクには、 std::setまたはunordered_mapを使用して実行できる一意性制約が必要です。

于 2012-11-26T20:40:31.217 に答える