加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 构建时保留子向量

发布时间:2020-12-16 05:29:17 所属栏目:百科 来源:网络整理
导读:我有这个: size_t n = 100;std::vectorstd::vectorfoo v(n); 子向量的计数是动态的,但是已知.然而,每个向量中的项目数量是不知道的,但是我有一个估计,所以我想在开始推回它们之前保留子向量.我目前正在做的是: size_t estimated_size = 1000;for (auto sub
我有这个:
size_t n = 100;
std::vector<std::vector<foo>> v(n);

子向量的计数是动态的,但是已知.然而,每个向量中的项目数量是不知道的,但是我有一个估计,所以我想在开始推回它们之前保留子向量.我目前正在做的是:

size_t estimated_size = 1000;
for (auto& sub_vector: v){
   sub_vector.reserve(estimated_size);
}

有没有更好的办法?喜欢在建造时做吗?

附:这不是一个选择:

size_t n = 100;
size_t estimated_size = 1000;
std::vector<std::vector<foo>> v(n,std::vector<foo>(estimated_size));

我只想在没有建设的情况下保留,因为foo是昂贵的,被建造两次.

解决方法

如果您真的想在构建向量时执行此操作,则可以使用需要两个迭代器的 constructor,并提供自己的自定义迭代器.取消引用迭代器将创建向量保留它然后返回它:
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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读