我可以将迭代器递增一个整数吗?
can I increment an iterator by an integer?
std::map<int, int> m;
// initialize m...
//
int n=3;
for (std::map<int, int>::iterator iter = m.begin()+n; iter != m.end(); ++iter)
// Is the above line correct?
{}
我可以按照代码中所示将迭代器递增一个整数吗?
只有当迭代器是随机访问迭代器时,您才能对它执行 "pointer arithmetic"。 std::set
、std::multiset
、std::map
和 std::multimap
的迭代器不是随机访问迭代器。为映射迭代器有效地支持 "increment by n
" 操作需要在红黑树结构中进行一些额外的簿记,这会增加所有用户的开销。这是一个很少需要的操作,因此标准库不支持它。
您可以使用 std::next(m.begin(), n)
的 "slow" 方式来完成。这只是将迭代器的副本递增 n
次,并将结果递增 returns。
您可以为此使用 std::advance()
或 std::next()
:
std::map<int, int> m;
...
for (auto iter = next(m.begin(), 3); iter != m.end(); ++iter)
{
}
无论迭代器类型如何,std::advance()
和 std::next()
都表现最佳。如果您将随机访问迭代器传递给他们,他们将使用 operator + ()
。否则,他们会重复使用 operator ++ ()
.
std::map<int, int> m;
// initialize m...
//
int n=3;
for (std::map<int, int>::iterator iter = m.begin()+n; iter != m.end(); ++iter)
// Is the above line correct?
{}
我可以按照代码中所示将迭代器递增一个整数吗?
只有当迭代器是随机访问迭代器时,您才能对它执行 "pointer arithmetic"。 std::set
、std::multiset
、std::map
和 std::multimap
的迭代器不是随机访问迭代器。为映射迭代器有效地支持 "increment by n
" 操作需要在红黑树结构中进行一些额外的簿记,这会增加所有用户的开销。这是一个很少需要的操作,因此标准库不支持它。
您可以使用 std::next(m.begin(), n)
的 "slow" 方式来完成。这只是将迭代器的副本递增 n
次,并将结果递增 returns。
您可以为此使用 std::advance()
或 std::next()
:
std::map<int, int> m;
...
for (auto iter = next(m.begin(), 3); iter != m.end(); ++iter)
{
}
无论迭代器类型如何,std::advance()
和 std::next()
都表现最佳。如果您将随机访问迭代器传递给他们,他们将使用 operator + ()
。否则,他们会重复使用 operator ++ ()
.