【问题标题】:Ordering output of C++ std::setC++ std::set 的排序输出
【发布时间】:2013-12-02 22:38:51
【问题描述】:

我想按字母顺序列出我的集合的输出。下面是一个尝试,但它似乎很慢/效率低,我什至还没有完成。

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

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

我也考虑过将对象从集合中移到另一个容器中,但似乎仍然效率低下。

【问题讨论】:

  • @AlexanderMyshov 很高兴您在这里尝试改进帖子,但请尝试找到比单个标签编辑更实质性的改进。谢谢!

标签: c++ set stdset


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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;
    

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 2011-01-08
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多