Implement vector constructor to support single-pass input iterator range#160
Implement vector constructor to support single-pass input iterator range#160winner245 wants to merge 3 commits into
Conversation
|
我上面说 |
|
都是支持的吧,您修改的vector(Iter first, Iter last),在作者的代码中虽然只是调用了range_init,但是range_init调用了uninitialized_copy,uninitialized_copy实现了对内置类型和自定义类型的重载,前者又调用了mystl::copy,这个函数实现了三个版本的重载,其中就有对输入迭代器的版本实现 |
|
@Peas-Li range_init() 一开始就用了 distance(first, last),而 input_iterator 是单次使用,用完后就走到了尽头。后面 init_space() 分配一段未初始化内存,而 uninitialized_copy() 会立即返回。 |
|
确实是,明白了,我对初始化为6个int长度的vector,用assign进行8个in长度istringstream的覆盖: |
|
这是由 下面的测试代码说明了一切: std::istringstream is("1 2 3"); while (beg != end) { std::cout << "beg == end ? " << std::boolalpha << (beg == end) << '\n'; while (iter1 != end) { while (iter2 != end) { |
|
看了你写的istream_iterator 和std里面的istream_iterator ,确实都存在这个问题,只有在不正当使用输入迭代器才会出现这样的情况,所以这个仓库不只是vector,list,deque等都有问题,作者习惯用输入迭代器计算distance,再给容器赋值 |
|
甚至你可以看到在我的pull requests中指明了_deque::insert_dispatch函数中,对输入迭代器执行了--操作 |
|
@winner245 @Peas-Li 两个 PR 有很多共同部分。要不先提取出公共部分来 PR? |
|
好的,那我来把公共部分的 PR 提交以下 |
d12eca6 to
126d03d
Compare
|
已完成 rebase 操作 |
|
重新修改了 input iterator 版 ctor 的实现,让其调用 range_init(,, input_iterator_tag) 重载,因此,将原来的 range_init 修改为了如下两个具有不同 iterator tag 的重载版: range_init(,, input_iterator_tag); 相信现在的版本更能与现有 code base 有机结合在一起。 |
目前的 vector 实现并不真正支持只能单次使用的 input_iterator,目前的实现本质上要求输入迭代器必须至少是 forward_iterator。这个问题不仅存在于构造函数,也存在于其他接受迭代器range的成员函数如 insert()/assign(),以及其他容器中。
此 PR 只对 vector ctor 增加了 input_iterator 支持。如果仓库作者愿意接受这个特性支持的话,我很乐意在此方向上继续贡献代码。