请求解析vector迭代器for循环并转换为基础形式
解析vector迭代器循环并转换为基础for循环
咱们先来看你给出的这段迭代器循环代码,先修正一个明显的笔误(原代码里的i++应该是it++,不然迭代器不会前进,直接死循环啦):
for(vector<CFreq>::iterator it = frequencies.begin(); it != frequencies.end(); it++) { HuffmanTree *node = new HuffmanTree(it->c, it->freq); queue.push(node); }
原代码的作用解析
这段代码是C++里用迭代器遍历vector<CFreq>容器frequencies的标准写法:
- 迭代器
it从容器的起始位置begin()出发,一直遍历到容器末尾的下一个位置(也就是end()指向的地方),当it == frequencies.end()时循环结束 - 每次循环中,
it->c和it->freq是访问当前迭代器指向的CFreq对象的成员变量(等价于(*it).c和(*it).freq) - 最后创建一个新的
HuffmanTree节点,把节点指针加入到queue队列中
转换为你熟悉的基础for循环(索引遍历版)
如果习惯用整数索引来遍历vector,完全可以写成下面这样,功能和原代码完全一致:
for (int i = 0; i < frequencies.size(); ++i) { // 用索引直接访问vector中的第i个元素,用引用避免拷贝,提升效率 CFreq& currentElement = frequencies[i]; HuffmanTree *node = new HuffmanTree(currentElement.c, currentElement.freq); queue.push(node); }
如果觉得引用没必要,也可以简化成直接访问:
for (int i = 0; i < frequencies.size(); ++i) { HuffmanTree *node = new HuffmanTree(frequencies[i].c, frequencies[i].freq); queue.push(node); }
额外补充:更简洁的范围for循环(C++11及以上可用)
如果你使用的是C++11或更高版本,还可以用范围for循环来写,代码更简洁易读:
for (auto& current : frequencies) { HuffmanTree *node = new HuffmanTree(current.c, current.freq); queue.push(node); }
内容的提问来源于stack exchange,提问作者splattered
相关产品推荐
相关产品推荐

