在构造时保留子向量

Hum*_*awi 10 c++ vector c++11

我有这个:

size_t n = 100;
std::vector<std::vector<foo>> v(n);
Run Code Online (Sandbox Code Playgroud)

计数sub vectors是动态的,但已知.然而,在每个项目的数量vector尚不清楚,但我有一个关于它的估计,所以我想reservesub vectors开始推回他们.我目前正在做的是:

size_t estimated_size = 1000;
for (auto& sub_vector: v){
   sub_vector.reserve(estimated_size);
}
Run Code Online (Sandbox Code Playgroud)

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

PS这不是一个选项:

size_t n = 100;
size_t estimated_size = 1000;
std::vector<std::vector<foo>> v(n, std::vector<foo>(estimated_size));
Run Code Online (Sandbox Code Playgroud)

我只是想在没有构建的情况下保留,因为foo要构建两次的costy.

use*_*895 3

如果您确实想在构造时执行此操作,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));
Run Code Online (Sandbox Code Playgroud)

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

现场演示。