You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:32:45