带有std :: vector和std :: set属性的容器?

时间:2015-01-14 16:29:46

标签: c++ c++11 containers

C ++世界中是否有一个具有这些属性的容器?

  • 元素是唯一的,并借助可自定义的比较器
  • 进行排序
  • 提供随机访问运算符。

我目前正在将我的数据收集到std::set<C,COMPARATOR>中,然后执行std::copy(_set.begin(),_set.end(),std::back_inserter(_vec))以便能够随机访问有序集合。然而,规模可能会达到数亿。

3 个答案:

答案 0 :(得分:8)

如果可以选择Boost,请查看flat_set in the Containers library

flat_set的界面与std::set的界面相同,但它提供随机访问迭代器,如std::vector

#include <boost/container/flat_set.hpp>

[...]

boost::container::flat_set<int> c;
c.insert(1);
c.insert(2);
c.insert(3);
c.insert(4);

// unfortunately, no operator[] on the container itself,
// but the iterator is random access
int third_element = c.begin()[2];

如果您遇到标准库,可以使用排序vector来实现此目的。标准库实际上在<algorithm>标头中提供了许多算法,允许您使用具有排序迭代器范围的set执行几乎任何操作。

答案 1 :(得分:1)

我不知道。但是,有了数亿个元素和一些有序访问,您可能希望您的内存表示紧凑且连续,这对您的容器类来说是更多的要求。

我选择std::vector并使用您描述的方法或任何其他排序算法。

1}之后你可能不会需要std::set,所以你可以释放记忆。

答案 2 :(得分:1)

不在标准C ++库中,没有。您可以set / priority_queue进行排序,也可以vector / deque进行随机访问。

但是没有什么可以阻止你在vector周围编写你自己的包装器,它只是强制执行排序。根本没有那么多代码。一些示例函数:

template <typename T, typename COMP = std::less<T>>
class sorted_vec {
    std::vector<T> vec_;

public:
    // random access
    using iterator = typename std::vector<T>::iterator;
    T& operator[](size_t idx) { return vec_[idx]; }

    iterator begin() { return vec_.begin(); }
    iterator end() { return vec_.end(); }

    // insertion
    void push(const T& val) {
        vec_.insert(std::lower_bound(vec_.begin(), vec_.end(), COMP{}),
                    val);
    }
};