C++矢量范围构造函数

C++ Vector Range Constructor

本文关键字:构造函数 范围 C++      更新时间:2023-10-16

当我想到向量容器没有一个构造函数时,我正在查看一些C++文档,该构造函数"轻松"允许用户传递一系列值 - 最小值和最大值 - 并构造一个具有最小值>最大值元素的向量。我觉得这很奇怪,所以我试着写自己的,发现它并不平凡。这是我的解决方案。

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
template <typename T>
class MyIterator: public std::iterator<std::input_iterator_tag, int>
{
public:
  MyIterator(T val):value(val) {}
  MyIterator(const MyIterator & m):value(m.value) {}
  MyIterator& operator ++() 
  {
  ++value; 
    return *this; 
  }
  MyIterator operator ++(int) 
  { 
    MyIterator temp(*this); 
    operator ++();
    return temp; 
  }
  bool operator ==(const MyIterator & m) const { return value == m.value; }
  bool operator !=(const MyIterator & m) const { return !(value == m.value); }
  T& operator *() { return value; }
private:
  T value;
};
int main(int argc, char** argv)
{ 
  std::vector<int> my_vec(MyIterator<int>(100), MyIterator<int>(400));
  std::copy(my_vec.begin(), my_vec.end(), std::ostream_iterator<int>(std::cout, "n"));
  return 0;
}

新C++对此有解决方案吗?

在 C++11 中,有 std::iota 函数。否则,您有例如 std::fillstd::fill_n,或std::generatestd::generate_n

对于 C++11,没有实质性的工作来更改算法或容器以使它们更容易使用(有几个新算法,容器知道分配器和右值)。C++14也没有实质性变化。

不过,C++17还是有一些希望的:Ranges研究小组正在研究使算法和容器更易于使用的概念。也就是说,目前尚不清楚这段旅程将前往哪里。