#include <algorithm>
#include <iostream>
#include <iterator>
class MyIterator : public std::iterator<std::random_access_iterator_tag, double>
{
public:
MyIterator() : container(nullptr), i(0), j(0) {}
MyIterator(const std::vector<std::vector<double>>& container,
std::size_t i,
std::size_t j) : container(&container), i(i), j(j)
{
// Skip empty container
if (i < container.size() && container[i].empty())
{
j = 0;
++(*this);
}
}
MyIterator(const MyIterator& rhs) = default;
MyIterator& operator = (const MyIterator& rhs) = default;
MyIterator& operator ++() {
if (++j >= (*container)[i].size()) {
do {++i;} while (i < (*container).size() && (*container)[i].empty());
j = 0;
}
return *this;
}
MyIterator operator ++(int) { auto it = *this; ++(*this); return it; }
MyIterator& operator --() {
if (j-- == 0) {
do { --i; } while (i != 0 && (*container)[i].empty());
j = (*container)[i].size();
}
return *this;
}
MyIterator operator --(int) { auto it = *this; --(*this); return it; }
double operator *() const { return (*container)[i][j]; }
bool operator == (const MyIterator& rhs) const {
return container == rhs.container && i == rhs.i && j == rhs.j;
}
bool operator != (const MyIterator& rhs) const { return !(*this == rhs); }
private:
const std::vector<std::vector<double>>* container;
std::size_t i;
std::size_t j;
};
MyIterator MyIteratorBegin(const std::vector<std::vector<double>>& container)
{
return MyIterator(container, 0, 0);
}
MyIterator MyIteratorEnd(const std::vector<std::vector<double>>& container)
{
return MyIterator(container, container.size(), 0);
}
int main() {
std::vector<std::vector<double>> values = {{5,0,8}, {}, {3,1,9}};
auto b = MyIteratorBegin(values);
auto e = MyIteratorEnd(values);
auto p = std::minmax_element(b, e);
if (p.first != e) {
std::cout << "min is " << *p.first << " and max is " << *p.second << std::endl;
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CgpjbGFzcyBNeUl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgZG91YmxlPgp7CnB1YmxpYzoKCU15SXRlcmF0b3IoKSA6IGNvbnRhaW5lcihudWxscHRyKSwgaSgwKSwgaigwKSB7fQoKCU15SXRlcmF0b3IoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8ZG91YmxlPj4mIGNvbnRhaW5lciwKCQkJICAgc3RkOjpzaXplX3QgaSwKCQkJICAgc3RkOjpzaXplX3QgaikgOiBjb250YWluZXIoJmNvbnRhaW5lciksIGkoaSksIGooaikKCXsKCQkvLyBTa2lwIGVtcHR5IGNvbnRhaW5lcgoJCWlmIChpIDwgY29udGFpbmVyLnNpemUoKSAmJiBjb250YWluZXJbaV0uZW1wdHkoKSkKCQl7CgkJCWogPSAwOwoJCQkrKygqdGhpcyk7CgkJfQoJfQoJTXlJdGVyYXRvcihjb25zdCBNeUl0ZXJhdG9yJiByaHMpID0gZGVmYXVsdDsKCU15SXRlcmF0b3ImIG9wZXJhdG9yID0gKGNvbnN0IE15SXRlcmF0b3ImIHJocykgPSBkZWZhdWx0OwoKCU15SXRlcmF0b3ImIG9wZXJhdG9yICsrKCkgewoJCWlmICgrK2ogPj0gKCpjb250YWluZXIpW2ldLnNpemUoKSkgewoJCSAgICBkbyB7KytpO30gd2hpbGUgKGkgPCAoKmNvbnRhaW5lcikuc2l6ZSgpICYmICgqY29udGFpbmVyKVtpXS5lbXB0eSgpKTsKCQkgICAgaiA9IDA7CgkJfQoJCXJldHVybiAqdGhpczsKCX0KCU15SXRlcmF0b3Igb3BlcmF0b3IgKysoaW50KSB7IGF1dG8gaXQgPSAqdGhpczsgKysoKnRoaXMpOyByZXR1cm4gaXQ7IH0KCQoJTXlJdGVyYXRvciYgb3BlcmF0b3IgLS0oKSB7CgkJaWYgKGotLSA9PSAwKSB7CgkJCWRvICB7IC0taTsgfSB3aGlsZSAoaSAhPSAwICYmICgqY29udGFpbmVyKVtpXS5lbXB0eSgpKTsKCQkJaiA9ICgqY29udGFpbmVyKVtpXS5zaXplKCk7CgkJfQoJCXJldHVybiAqdGhpczsKCX0KCU15SXRlcmF0b3Igb3BlcmF0b3IgLS0oaW50KSB7IGF1dG8gaXQgPSAqdGhpczsgLS0oKnRoaXMpOyByZXR1cm4gaXQ7IH0KCQoJZG91YmxlIG9wZXJhdG9yICooKSBjb25zdCB7IHJldHVybiAoKmNvbnRhaW5lcilbaV1bal07IH0KCQoJCglib29sIG9wZXJhdG9yID09IChjb25zdCBNeUl0ZXJhdG9yJiByaHMpIGNvbnN0IHsKCQlyZXR1cm4gY29udGFpbmVyID09IHJocy5jb250YWluZXIgJiYgaSA9PSByaHMuaSAmJiBqID09IHJocy5qOwoJfQoJYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgTXlJdGVyYXRvciYgcmhzKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHJocyk7IH0KCQpwcml2YXRlOgoJY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8ZG91YmxlPj4qIGNvbnRhaW5lcjsKCXN0ZDo6c2l6ZV90IGk7CglzdGQ6OnNpemVfdCBqOwp9OwoKTXlJdGVyYXRvciBNeUl0ZXJhdG9yQmVnaW4oY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8ZG91YmxlPj4mIGNvbnRhaW5lcikKewoJcmV0dXJuIE15SXRlcmF0b3IoY29udGFpbmVyLCAwLCAwKTsKfQoKTXlJdGVyYXRvciBNeUl0ZXJhdG9yRW5kKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGRvdWJsZT4+JiBjb250YWluZXIpCnsKCXJldHVybiBNeUl0ZXJhdG9yKGNvbnRhaW5lciwgY29udGFpbmVyLnNpemUoKSwgMCk7Cn0KCmludCBtYWluKCkgewoJc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8ZG91YmxlPj4gdmFsdWVzID0ge3s1LDAsOH0sIHt9LCB7MywxLDl9fTsKCQoJYXV0byBiID0gTXlJdGVyYXRvckJlZ2luKHZhbHVlcyk7CglhdXRvIGUgPSBNeUl0ZXJhdG9yRW5kKHZhbHVlcyk7CglhdXRvIHAgPSBzdGQ6Om1pbm1heF9lbGVtZW50KGIsIGUpOwoJCglpZiAocC5maXJzdCAhPSBlKSB7CgkJc3RkOjpjb3V0IDw8ICJtaW4gaXMgIiA8PCAqcC5maXJzdCA8PCAiIGFuZCBtYXggaXMgIiA8PCAqcC5zZWNvbmQgPDwgc3RkOjplbmRsOwoJfQoJCn0=