普通的标准迭代方法是这样的:
for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
/* std::cout << *it; ... */
}
它涉及太多的键入和重复向量变量名称。
有没有一种方法可以简化它,例如
for (auto item : vector_var) { /*...*/ }
循环,但也可以访问索引和其他功能。
我想到这个:
for (auto item : myIterationClass(vector_var)) {
item->index;
item->value;
item->delete();
item->replaceWith(42);
}
它并不一定要很快,但要依靠我需要编写的代码。
假设您接受循环稍有变化,那肯定是可行的:
for (auto item : myIterationClass(vector_var)) {
item.index();
item.value();
item.erase();
item.replaceWith(42);
}
这个想法是要有myIterationClass()
一个薄包装器,它会返回带有相当自定义值的迭代器。但是,使用erase()
有点问题,因为您不应该在迭代容器时更改容器,即,如果确实需要这些容器,则必须记录要擦除的元素并在以后进行处理。
尽管这不是一个好主意,但下面是实现index()
和的快速演示value()
。实现replaceWith()
将是微不足道的,而实现任何改变序列长度的操作可能会很有趣。假定迭代器控制序列,则可以直接更改基础序列并适当调整保留的索引来完成。请注意,还有多种表示迭代器的方法。我随机选择使用指向容器的指针和索引的组合。如果序列不添加或删除元素,也可以使用两个迭代器并计算索引作为两者之间的差值来完成。
#include <algorithm>
#include <iostream>
#include <vector>
template <typename T>
class wrapped_iterator
{
T* container;
typename T::size_type position;
public:
wrapped_iterator(T* container, typename T::size_type position)
: container(container)
, position(position) {
}
wrapped_iterator<T>& operator*() { return *this; }
wrapped_iterator<T>& operator++() { ++position; return *this; }
wrapped_iterator<T> operator++(int) {
wrapped_iterator<T> rc(*this);
++*this;
return rc;
}
bool operator== (wrapped_iterator<T> const& other) const {
return position == other.position;
}
bool operator!= (wrapped_iterator<T> const& other) const {
return !(*this == other);
}
typename T::size_type index() const { return position; }
typename T::const_reference& value() const { return (*container)[position]; }
};
template <typename T>
class wrapped
{
T* container;
public:
typedef wrapped_iterator<T> iterator;
wrapped(T& container): container(&container) {}
iterator begin() const { return iterator(container, 0u); }
iterator end() const { return iterator(container, container->size()); }
};
template <typename T>
wrapped<T> wrapper(T& container) {
return wrapped<T>(container);
}
int main()
{
std::vector<int> v{ 7, 6, 5, 4, 3, 2, 1 };
for (auto item : wrapper(v)) {
std::cout << "index=" << item.index() << ' '
<< "value=" << item.value() << '\n';
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句