订购C ++ std :: set的输出

时间:2013-12-02 22:38:51

标签: c++ set stdset

我想按字母顺序列出我的集合的输出。下面是试图达到这个目标,但它似乎缓慢/低效,我还没有完成它。

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;
        }
    }
}

显然,这只会输出按字母顺序排在第一个对象之后的对象。

我还考虑过将一个集合中的对象移动到另一个容器中,但它仍然效率低下。

2 个答案:

答案 0 :(得分:4)

std::set是一个有序的容器,参见参考:
http://en.cppreference.com/w/cpp/container/set

  

std::set是一个关联容器,包含有序集   Key类型的唯一对象。使用密钥比较进行排序   功能比较。搜索,删除和插入操作具有   对数复杂度。集合通常实现为红黑色   树。

答案 1 :(得分: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;