C++ 如何更优雅地实现忽略指定数量的用户输入行?
有几个可优化的点,优化后的实现逻辑更简洁,性能也更好:
优化方案1:拆分循环+流忽略(最通用,兼容所有C++版本)
直接把读写逻辑拆成两个独立循环,去掉循环内的分支判断,丢弃行的时候直接用输入流的ignore方法,不需要定义临时trash变量:
#include <limits> // 需要引入这个头文件使用numeric_limits // 读取前n行存入text数组 for (int i = 0; i < n; ++i) { getline(cin, text[i]); } // 丢弃后n行 for (int i = 0; i < n; ++i) { // 直接忽略到换行符为止,不需要分配字符串内存存储废弃内容 cin.ignore(numeric_limits<streamsize>::max(), '\n'); }
优势:
- 无多余的条件分支,逻辑直白可读性更高
- 不需要临时存储废弃行内容,避免不必要的内存分配、拷贝操作,行内容越长性能优势越明显
- 代码更精简,无冗余变量
优化方案2:STL算法简化(适合C++11及以上版本)
如果你的text是std::vector<std::string>类型,可以用STL算法进一步简化代码:
#include <limits> #include <vector> #include <string> #include <algorithm> std::vector<std::string> text; text.reserve(n); // 预分配空间避免多次扩容 // 读前n行 for (int i = 0; i < n; ++i) { std::string line; std::getline(std::cin, line); text.emplace_back(std::move(line)); } // 丢弃后n行 for (int i = 0; i < n; ++i) { std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); }
注意事项
如果输入流可能存在换行符异常的情况(比如最后一行没有换行符),可以在ignore调用后判断cin.eof()状态做兼容处理,常规场景下上述写法都可以正常运行。
内容的提问来源于stack exchange,提问作者baronsec
相关产品推荐
相关产品推荐

