我有这个:

size_t n = 100;
std::vector<std::vector<foo>> v(n);
sub vectors的计数是动态的,但已知。但是,每个vector中的项目数量未知,但我对此有一个估计,因此我想先将reserve进行sub vectors,然后再开始将其推回去。我目前正在做的是:
size_t estimated_size = 1000;
for (auto& sub_vector: v){
   sub_vector.reserve(estimated_size);
}

有没有更好的办法?喜欢在施工时这样做吗?

P.S.这不是一个选择:
size_t n = 100;
size_t estimated_size = 1000;
std::vector<std::vector<foo>> v(n, std::vector<foo>(estimated_size));

我只想保留而不构造,因为foo构造两次很昂贵。

最佳答案

如果您真的想在构造vector时这样做,则可以使用带有两个迭代器并提供自己的自定义迭代器的constructor。取消引用迭代器将创建一个 vector ,将其保留,然后将其返回:

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

但是我不希望它比循环快,而且我也不认为它更具可读性。

Live demo.

关于c++ - 构造时保留子 vector ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35718767/

10-17 02:09