我可以将迭代器增加一个整数吗?

时间:2018-10-13 00:40:04

标签: c++ dictionary iterator std stdmap

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?
{}

我可以按照代码中所示的整数递增迭代器吗?

2 个答案:

答案 0 :(得分:3)

仅当它是随机访问迭代器时,才可以在迭代器上执行“指针算术”。 std::setstd::multisetstd::mapstd::multimap的迭代器不是随机访问迭代器。为地图迭代器有效地支持“ n递增”操作将需要在红黑树结构内进行一些额外的簿记,这将增加所有用户的开销。这是很少需要的操作,因此标准库中不支持该操作。

您可以使用std::next(m.begin(), n)以“慢速”方式进行操作。只需将迭代器的副本递增n次并返回结果即可。

答案 1 :(得分:3)

您可以为此使用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 ++ ()