C ++世界中是否有一个具有这些属性的容器?
我目前正在将我的数据收集到std::set<C,COMPARATOR>
中,然后执行std::copy(_set.begin(),_set.end(),std::back_inserter(_vec))
以便能够随机访问有序集合。然而,规模可能会达到数亿。
答案 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);
}
};