-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement vector constructor to support single-pass input iterator range #160
base: master
Are you sure you want to change the base?
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 支持。如果仓库作者愿意接受这个特性支持的话,我很乐意在此方向上继续贡献代码。