咨询C++ multiset指定位置元素的取值方法(首次使用)
解决C++ multiset获取指定位置元素的问题
首先明确:你用numerator.find(i)的方式完全错误,multiset::find()的作用是查找值等于i的元素并返回其迭代器,不是按位置索引获取元素。
为什么不能直接按索引访问multiset?
multiset属于有序关联容器,底层通常基于红黑树实现,它的迭代器是双向迭代器,不支持随机访问(比如像vector那样用[]直接取索引位置的元素),所以要获取第i个位置的元素,需要从起始迭代器开始手动移动i次。
正确实现方式
方式1:直接遍历所有元素(最推荐,效率最高)
如果你的需求是遍历multiset的所有元素,不需要刻意按索引访问,直接用范围for或者迭代器遍历即可:
void Fraction::Invert() { int tmp = 0; // 范围for遍历,简洁直观 for (const auto& num : numerator) { tmp = num; // 这里添加你要执行的逻辑,比如交换分子分母相关操作 } // 或者用迭代器遍历(和范围for等价) // for (auto it = numerator.begin(); it != numerator.end(); ++it) { // tmp = *it; // // 你的逻辑 // } }
方式2:按索引获取指定位置元素
如果确实需要获取第i个位置的元素,可以用std::next函数(需要包含<iterator>头文件),或者手动移动迭代器:
#include <iterator> // 必须包含这个头文件才能用std::next void Fraction::Invert() { int tmp = 0; for (int i = 0; i < (int)numerator.size(); ++i) { // 从begin()迭代器移动i步,解引用得到对应位置的值 tmp = *std::next(numerator.begin(), i); // 你的逻辑 } }
⚠️ 注意:这种方式的时间复杂度是O(n²),因为每次std::next对双向迭代器都要移动i次,数据量大时效率很低,非必要不推荐。
内容的提问来源于stack exchange,提问作者codeblue
相关产品推荐
相关产品推荐

