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。排序是使用键比较功能比较完成的。搜索、删除和插入操作具有对数复杂性。集合通常实现为红黑树。

于 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 回答