C++列表迭代器算术替换思路
c++ list iterator arithmetic replacement ideas
我有一个可以在多个地方访问的列表。在某些情况下,我需要从开始到 (end-n) 元素遍历列表,而在其他情况下,我需要访问整个列表。我在迭代器算法上遇到了麻烦。
我想要可以执行以下操作的东西:
int n =10;
for (list<Term>::iterator itr = final.begin(); itr != (final.end()-n); itr++) {
//
}
下面的伪代码有意义吗?
int N = myList.size() - n;
for (list<Term>::iterator itr = final.begin(),int length_reached=0; itr != (final.end() && length_reached<N; itr++,length_reached++) {
//
}
对我来说使用 rbegin 不是一个选项,因为我想要从列表开头开始匹配的第一个实例。
这里有没有更好的实现方式?
由于是列表,随机访问比较慢。幸运的是:
- 你总是从头开始,
std::list
有一个 size() 方法
这是一种方法:
list<Term>::iterator itr = final.begin();
int to_do = std::max(0, int(final.size()) - n);
for ( ; to_do ; --to_do, ++itr )
{
// code here
}
您可以使用反向迭代器和 std::advance
auto rit =final.rbegin();
std::advance(rit, n);
for (auto itr=final.begin(); itr!=rti.base(); ++itr) {
}
是的,你可以这样做
if ( n < final.size() )
{
auto m = final.size() - n;
for ( auto first = final.begin(); m != 0; ++first, --m )
{
//...
}
}
如果迭代器本身可以在循环中改变那么你可以这样写循环条件
if ( n < final.size() )
{
auto m = final.size() - n;
for ( auto first = final.begin(); m != 0 && first != final.end(); ++first, --m )
{
//...
}
}
我有一个可以在多个地方访问的列表。在某些情况下,我需要从开始到 (end-n) 元素遍历列表,而在其他情况下,我需要访问整个列表。我在迭代器算法上遇到了麻烦。
我想要可以执行以下操作的东西:
int n =10;
for (list<Term>::iterator itr = final.begin(); itr != (final.end()-n); itr++) {
//
}
下面的伪代码有意义吗?
int N = myList.size() - n;
for (list<Term>::iterator itr = final.begin(),int length_reached=0; itr != (final.end() && length_reached<N; itr++,length_reached++) {
//
}
对我来说使用 rbegin 不是一个选项,因为我想要从列表开头开始匹配的第一个实例。
这里有没有更好的实现方式?
由于是列表,随机访问比较慢。幸运的是:
- 你总是从头开始,
std::list
有一个 size() 方法
这是一种方法:
list<Term>::iterator itr = final.begin();
int to_do = std::max(0, int(final.size()) - n);
for ( ; to_do ; --to_do, ++itr )
{
// code here
}
您可以使用反向迭代器和 std::advance
auto rit =final.rbegin();
std::advance(rit, n);
for (auto itr=final.begin(); itr!=rti.base(); ++itr) {
}
是的,你可以这样做
if ( n < final.size() )
{
auto m = final.size() - n;
for ( auto first = final.begin(); m != 0; ++first, --m )
{
//...
}
}
如果迭代器本身可以在循环中改变那么你可以这样写循环条件
if ( n < final.size() )
{
auto m = final.size() - n;
for ( auto first = final.begin(); m != 0 && first != final.end(); ++first, --m )
{
//...
}
}