0

セットの出力をアルファベット順にリストしたいと思います。以下はこれに到達するための試みですが、遅い/非効率的で、まだ完了していません。

void ordered(ostream &os) {
    bool inserted = false;
    for (objects::iterator i = begin(); i != end(); ) {
        for (objects::iterator x = begin(); x != end(); ++x) {
            if((**i) < (**x)) { //overloaded and works
                os << **i << endl;
                inserted = true;
                break;
            }
        }
        if(inserted) {
            ++i;
        }
    }
}

明らかに、これはアルファベット順で最初のオブジェクトの後に来るオブジェクトのみを出力します。

オブジェクトをセットから別のコンテナーに移動することも検討しましたが、それでも効率が悪いようです。

4

2 に答える 2

4

これstd::setは注文済みのコンテナーです。参照を参照してください:
http://en.cppreference.com/w/cpp/container/set

std::setタイプ の一意のオブジェクトの並べ替えられたセットを含む連想コンテナですKey。並べ替えは、キー比較関数 Compare を使用して行われます。検索、削除、および挿入操作には、対数の複雑さがあります。セットは通常、赤黒木として実装されます。

于 2013-12-02T22:40:40.223 に答える
0

std::setすでに注文されています。ポインター自体の代わりに、ポイントされた値を比較するカスタム比較子を使用するだけでよいようです (これがデフォルトです)。

template<typename T> struct pless {
    inline bool operator()(const T* a, const T* b) const { return *a < *b; }
};
std::set<Foo*, pless<Foo> > objects;
于 2013-12-02T22:44:05.297 に答える