C++中实现std::vector无限循环直至终止,当前写法是否最优?
你的遍历方案可以优化,咱们一步步说
首先得先指出你代码里的一个常见bug:文件读取的while (!infile.eof())写法是有问题的——eof()只有在读取失败后才会置位,这会导致最后一行被重复读取一次(或者当文件末尾有空行时出现错误的转换)。正确的做法是把getline直接放在循环条件里,这样能保证每次读取成功才处理。
然后再聊核心逻辑的优化:你的核心需求是反复遍历std::vector,累加sum直到出现重复值就终止,这个逻辑是没问题的,但在数据结构和细节上还有提升空间。
具体优化点
修复文件读取逻辑:
原来的读取代码:while (!infile.eof()) { getline(infile, str); vec.push_back(std::stoi(str)); } infile.close();可以改成:
// 利用getline的返回值判断读取是否成功,同时省略手动close(ifstream是RAII类型,离开作用域自动关闭) while (getline(infile, str)) { vec.push_back(std::stoi(str)); }替换数据结构提升效率:
你现在用的std::set,它的count()和insert()操作都是O(log n)的时间复杂度。如果换成std::unordered_set(哈希集合),平均情况下这两个操作都是O(1),当sum的数量越来越多的时候,这个效率提升会非常明显。循环结构的小细节:
外层的while(true)其实很直观,因为终止条件是内部的return,所以不用改也没问题;如果想让代码更“显式”,也可以用一个布尔变量控制,但不是必须的。
优化后的完整代码
#include <iostream> #include <fstream> #include <vector> #include <unordered_set> #include <string> int main() { std::string str; std::ifstream infile("Text.txt"); // 直接在构造时打开文件 std::vector<int> vec; std::unordered_set<int> sums; int sum = 0; sums.insert(sum); while (getline(infile, str)) { vec.push_back(std::stoi(str)); } while (true) { for (int i : vec) { sum += i; if (sums.count(sum)) { std::cout << sum; return 0; } sums.insert(sum); } } }
总结
你的原始写法核心逻辑是正确的,但在文件读取的健壮性和数据结构的效率上有优化空间。调整后的版本既修复了潜在bug,又提升了运行效率,算是更优的方案。
内容的提问来源于stack exchange,提问作者Nikola Jovišić
相关产品推荐
相关产品推荐

