C++矢量范围构造函数
C++ Vector Range Constructor
当我想到向量容器没有一个构造函数时,我正在查看一些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::fill
和std::fill_n
,或std::generate
和std::generate_n
。
对于 C++11,没有实质性的工作来更改算法或容器以使它们更容易使用(有几个新算法,容器知道分配器和右值)。C++14也没有实质性变化。
不过,C++17还是有一些希望的:Ranges研究小组正在研究使算法和容器更易于使用的概念。也就是说,目前尚不清楚这段旅程将前往哪里。
相关文章:
- C++11:没有复制构造函数的自定义基于范围的循环
- std::vector 范围构造函数可以调用显式转换吗?
- C++:SFINAE 来区分填充和范围构造函数?
- 如何在C++11中区分填充构造函数和范围构造函数
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- 子类化 STL 容器:范围构造函数不起作用
- 基于范围的 std::move 调用意外复制构造函数
- 基于容器范围的构造函数效率
- 删除复制构造函数和运算符=类范围访问
- 正确编写基于范围的构造函数
- 在构造函数中 'cout' 未在此范围内声明
- 为什么范围V3产量需要默认构造函数
- 当第一个 itr 在最后一个 itr 之后时,std::vector 范围构造函数的官方行为是什么?
- C 11矢量构造函数复制与范围
- 无法从构造函数访问私有变量 - 不在范围(C )中
- 比较迭代器value_type范围构造函数
- 如何使用默认移动构造函数将数据移出范围
- 构造函数中变量的 C++ 范围
- C++矢量范围构造函数
- 向量下标超出范围-类构造函数初始化中的2D向量