wxWidgets ツリー コントロールを使用して同様の問題を解決しました。シングルトン参照カウンターを使用して、コントロールに配置するオブジェクトを追跡し、反復子を使用してそれらをトラバースしました。これが例です。
class ReferenceCounter
{
public:
// Singleton pattern. Implementation left up to you.
static ReferenceCounter& get();
void add(const TreeData& data) {
mCounter[data.getId()].push_back(&data);
}
void remove(const TreeData& data) {
const CounterType::const_iterator itr = mCounter.find(data.getId());
if (itr != mCounter.end()) {
ItemType& items = itr->second;
items.erase(std::remove(items.begin(), items.end(), &data), items.end());
if (items.empty()) {
mCounter.erase(itr);
}
}
}
typedef std::vector<TreeData*> ItemType;
ItemType::iterator begin(const TreeData& data) {
const CounterType::const_iterator itr = mCounter.find(data.getId());
if (itr != mCounter.end()) {
return itr->second.begin();
}
// Else condition handling left up to you.
}
ItemType::iterator end(const TreeData& data) {
const CounterType::const_iterator itr = mCounter.find(data.getId());
if (itr != mCounter.end()) {
return itr->second.end();
}
// Else condition handling left up to you.
}
private:
typedef std::map<int, ItemType> CounterType;
CounterType mCounter;
};
class TreeData
{
public:
TreeData() { ReferenceCounter::get().add(*this); }
~TreeData() { ReferenceCounter::get().remove(*this); }
// Get database rows or whatever your tree is tracking.
int getId() const;
};
したがって、任意の TreeData を指定すると、参照カウンターで ID が一致する他のすべての TreeData を検索できます。これにより、名前などを最新の状態に簡単かつ迅速に維持できます。私たちのツリーは、1,000,000 を超えるノードを問題なく処理します。私の実装では、boost::iterator_facade使いやすいように反復処理をクラスにまとめました。