我有这个:
@H_404_2@size_t n = 100;
std::vector<std::vector<foo>> v(n);
子向量的计数是动态的,但是已知.然而,每个向量中的项目数量是不知道的,但是我有一个估计,所以我想在开始推回它们之前保留子向量.我目前正在做的是:
@H_404_2@size_t estimated_size = 1000; for (auto& sub_vector: v){ sub_vector.reserve(estimated_size); }有没有更好的办法?喜欢在建造时做吗?
附:这不是一个选择:
@H_404_2@size_t n = 100; size_t estimated_size = 1000; std::vector<std::vector<foo>> v(n,std::vector<foo>(estimated_size));我只想在没有建设的情况下保留,因为foo是昂贵的,被建造两次.
@R_301_323@
如果您真的想在构建向量时执行此操作,则可以使用需要两个迭代器的
constructor,并提供自己的自定义迭代器.取消引用迭代器将创建向量保留它然后返回它:
@H_404_2@class VectorReserveItr : public std::iterator<std::input_iterator_tag,foo> {
size_t i;
size_t capacity;
public:
VectorReserveItr(size_t i,size_t capacity) : i(i),capacity(capacity) {}
VectorReserveItr& operator++() { ++i; return *this; }
bool operator!=(const VectorReserveItr& rhs) { return i != rhs.i; }
std::vector<foo> operator*() {
std::vector<foo> ret;
ret.reserve(capacity);
return ret;
}
};
std::vector<std::vector<foo>> v(VectorReserveItr(0,1000),VectorReserveItr(100,1000));
但我不会期望它比循环更快,我不认为它也更可读.