iterator 类

class QMap::iterator

QMap::iterator 类为 QMapQMultiMap 提供 STL 风格的非常量迭代器。更多内容…

公共成员类型

typedef iterator_category

公共成员函数

iterator()
const Key & key() const
T & value() const
bool operator!=(const iterator &other) const
bool operator!=(const const_iterator &other) const
T & operator*() const
iterator operator+(int j) const
iterator & operator++()
iterator operator++(int)
iterator & operator+=(int j)
iterator operator-(int j) const
iterator & operator—()
iterator operator—(int)
iterator & operator-=(int j)
T * operator->() const
bool operator==(const iterator &other) const
bool operator==(const const_iterator &other) const

详细描述

QMap 同时提供 STL 风格迭代器Java 风格迭代器。STL 风格迭代器更底层,使用更笨拙;同时也稍快一些。对于已经了解 STL 的开发者来说更加熟悉。

QMap::iterator 用来遍历 QMap (或 QMultiMap) 并修改与特定键相关联的值(不能修改键)。如果想遍历常量 QMap,应该使用 QMap::const_iterator。对于非常量 QMap,使用 QMap::const_iterator 通常是好的编程实践,除非需要在遍历时改变 QMap。常量类型的迭代器稍快一些并可以提高代码可读性。

QMap::iterator 的默认构造函数创建一个未初始化的迭代器。必须在开始遍历前使用 QMap::begin(),QMap::end() 或 QMap::find() 等 QMap 函数初始化它。下面是一个典型的循环,该循环打印出 map 中的所有键值对:

  1. QMap<QString, int> map;
  2. map.insert("January", 1);
  3. map.insert("February", 2);
  4. ...
  5. map.insert("December", 12);
  6. QMap<QString, int>::iterator i;
  7. for (i = map.begin(); i != map.end(); ++i)
  8. cout << i.key() << ": " << i.value() << Qt::endl;

与无序存储元素的 QHash 不同,QMap 通过键的大小有序存储元素。相同键的元素(当 map 是 QMultiMap 时)将按照从最新到最早插入的顺序连续出现。

让我们通过几个例子来了解哪些情况下可以用 QMap::iterator 而不能用 QMap::const_iterator。下面的例子将存储在 QMap 中的每个值增加2:

  1. QMap<QString, int>::iterator i;
  2. for (i = map.begin(); i != map.end(); ++i)
  3. i.value() += 2;

下面的例子移除所有键字符串的首字符是下划线的元素:

  1. QMap<QString, int>::iterator i = map.begin();
  2. while (i != map.end()) {
  3. if (i.key().startsWith('_'))
  4. i = map.erase(i);
  5. else
  6. ++i;
  7. }

QMap::erase() 的调用从 map 中移除迭代器所指元素,返回指向下一个元素的迭代器。下面是另一个在遍历时移除元素的方法:

  1. QMap<QString, int>::iterator i = map.begin();
  2. while (i != map.end()) {
  3. QMap<QString, int>::iterator prev = i;
  4. ++i;
  5. if (prev.key().startsWith('_'))
  6. map.erase(prev);
  7. }

有人会写出像下面这样的代码:

  1. // WRONG
  2. while (i != map.end()) {
  3. if (i.key().startsWith('_'))
  4. map.erase(i);
  5. ++i;
  6. }

然而,这会导致程序在 ++i 处崩溃,因为调用完 erase() 后,i成为悬空迭代器。

同一 map 可以使用多个迭代器。如果向 map 添加元素,已有的迭代器仍然有效。如果从 map 移除元素,指向被移除元素的迭代器会变成悬空迭代器。

警告: 隐式共享容器迭代器的工作方式和 STL 迭代器不完全相同。当容器的迭代器还处于活动状态时,应该避免拷贝容器。更多信息请参阅 隐式共享迭代器问题

另请参阅 QMap::const_iteratorQMap::key_iterator,and QMutableMapIterator.

成员类型文档

typedef iterator::iterator_category

std::bidirectional_iterator_tag 的别名,表明该迭代器是双向迭代器。

成员函数文档

bool iterator::operator!=(const const_iterator &other) const

bool iterator::operator!=(const iterator &other) const

如果 other 与本迭代器指向的元素不同,返回 true;否则返回 false

另请参阅 operator==()。

bool iterator::operator==(const const_iterator &other) const

bool iterator::operator==(const iterator &other) const

如果 other 与本迭代器指向相同的元素,返回 true;否则返回 false

另请参阅 operator!=()。

iterator::iterator()

构造一个未初始化的迭代器。

一定不要对未初始化的迭代器调用 key(),value() 和 operator++() 等函数。使用前要用 operator=() 赋值。

另请参阅 QMap::begin() 和 QMap::end()。

const Key &iterator::key() const

以常引用返回当前元素的键。

不能直接通过迭代器改变元素的键,尽管可以通过调用 QMap::erase() 后再调用 QMap::insert() 或 QMap::insertMulti()(译者注:该函数在 Qt 5.15 中废弃)的方式来改变键。

另请参阅 value()。

T &iterator::value() const

返回当前元素值的可修改引用。

可以通过在赋值运算符左边使用 value() 来修改元素的值,例如:

  1. if (i.key() == "Hello")
  2. i.value() = "Bonjour";

另请参阅 key() 和 operator*()。

T &iterator::operator*() const

返回当前元素值的可修改引用。

value().

另请参阅 key()。

iterator iterator::operator+(int j) const

返回迭代器,指向该迭代器之前 j 个位置的元素。(如果 j 为负,则为之后 j 个位置。)

j 值较大时,该操作会比较慢。

另请参阅 operator-()。

iterator &iterator::operator++()

前置 ++ 运算符(++i)将迭代器向前移动到 map 中的下一个元素并返回指向新位置元素的迭代器。

QMap::end() 调用该函数将导致未定义结果。

另请参阅 operator—()。

iterator iterator::operator++(int)

这是一个重载函数。

后置 ++ 运算符(i++)将迭代器向前移动到 map 中的下一个元素并返回指向旧位置元素的迭代器。

iterator &iterator::operator+=(int j)

使迭代器前进 j 个元素。(如果 j 为负,则后退 j 个位置。)

另请参阅 operator-=() 和 operator+()。

iterator iterator::operator-(int j) const

返回迭代器,指向该迭代器之后 j 个位置的元素。(如果 j 为负,则为之前 j 个位置。)

j 值较大时,该操作会比较慢。

另请参阅 operator+()。

iterator &iterator::operator—()

前置 — 运算符(--i)使前一个元素成为当前元素并返回指向新位置元素的迭代器。

QMap::begin() 调用该函数将导致未定义结果。

另请参阅 operator++()。

iterator iterator::operator—(int)

这是一个重载函数。

后置 — 运算符(i--)使前一个元素成为当前元素并返回指向旧位置元素的迭代器。

iterator &iterator::operator-=(int j)

使迭代器后退 j 个元素。(如果 j 为负,则前进 j 个位置。)

另请参阅 operator+=() 和 operator-()。

T *iterator::operator->() const

返回指向当前元素值的指针。

另请参阅 value()。