QMap的坑

QMap<double, QString> map;

在项目中,使用QMap对数据进行从小到大的排序,然后再将数据迭代出来,但是出现了QMap数据存入错误的问题,原因是:-0 等于 0. 导致了存入相同的Key值,最终导致map没有存完,从而发生一系列问题。吃一堑长一智,在此记录一下。

### 在 Qt C++ 中遍历 QMap 的方法 在 Qt C++ 中,`QMap` 是一种关联容器,用于存储键值对。可以通过多种方式进行遍历,包括使用传统的迭代器和现代的范围基础 `for` 循环(C++11 及更高版本)。以下是详细的说明和示例代码。 --- #### 1. 使用常量迭代器 (`const_iterator`) 遍历 QMap 如果不需要修改 QMap 中的内容,则推荐使用 `const_iterator` 进行遍历。这种方式能够确保数据的安全性和一致性[^1]。 ```cpp #include <QMap> #include <QDebug> int main() { QMap<QString, int> map; map["apple"] = 1; map["banana"] = 2; map["cherry"] = 3; QMap<QString, int>::const_iterator it; for (it = map.constBegin(); it != map.constEnd(); ++it) { qDebug() << "Key:" << it.key() << "Value:" << it.value(); } return 0; } ``` 此代码片段展示了如何通过 `const_iterator` 访问 QMap 中的所有键值对,并打印它们。 --- #### 2. 使用可变迭代器 (`iterator`) 遍历 QMap 当需要修改 QMap 中的数据时,应使用普通的 `iterator` 而不是 `const_iterator`[^2]。 ```cpp #include <QMap> #include <QDebug> int main() { QMap<QString, int> map; map["apple"] = 1; map["banana"] = 2; map["cherry"] = 3; QMap<QString, int>::iterator it; for (it = map.begin(); it != map.end(); ++it) { (*it)++; qDebug() << "Modified Key:" << it.key() << "New Value:" << it.value(); } return 0; } ``` 在此示例中,我们不仅访问了键值对,还对其进行了修改(将每个值加一),并打印更新后的结果[^2]。 --- #### 3. 使用范围基础的 `for` 循环(C++11 或更高) 自 C++11 开始,可以使用更加简洁的语法——范围基础的 `for` 循环来遍历 QMap。这种方法适用于只需要读取数据的情况[^1]。 ```cpp #include <QMap> #include <QDebug> int main() { QMap<QString, int> map; map["apple"] = 1; map["banana"] = 2; map["cherry"] = 3; for (auto it = map.cbegin(); it != map.cend(); ++it) { qDebug() << "Key:" << it.key() << "Value:" << it.value(); } // 或者直接解构为 key-value 对 for (const auto &pair : map) { qDebug() << "Key:" << pair.first << "Value:" << pair.second; } return 0; } ``` 注意:第二种写法中的 `pair` 并不完全适用,因为 `QMap` 不像标准库容器那样提供直接的 `std::pair` 支持。因此建议优先使用第一种形式。 --- #### 4. 仅获取值列表 有时可能只需提取 QMap 中的所有值而忽略其对应的键。此时可以直接使用 `values()` 方法或者单独遍历值[^3]。 ```cpp #include <QMap> #include <QDebug> int main() { QMap<QString, int> map; map["apple"] = 1; map["banana"] = 2; map["cherry"] = 3; QMap<QString, int>::const_iterator it; for (it = map.constBegin(); it != map.constEnd(); ++it) { qDebug() << "Value:" << it.value(); } // 或者使用 values() QList<int> valueList = map.values(); foreach (int value, valueList) { qDebug() << "Value from list:" << value; } return 0; } ``` 这段代码演示了两种不同的方式来获取 QMap 中的所有值。 --- ### 总结 以上介绍了三种主要的 QMap 遍历方法:使用 `const_iterator`、`iterator` 和范围基础的 `for` 循环。每种方法都有其特定的应用场景,开发者可以根据需求选择合适的方式。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值