C++遍历set/map等容器输出时避免末尾多余空格的写法问题
问题说明
竞技编程场景中,输出末尾的多余空格会直接导致答案被判错,遍历set、map这类容器输出元素时,需要保证最后一个元素后不附加空格。
最初的范围for写法会产生末尾多余空格,代码如下:
#include <iostream> #include <set> using namespace std; int main() { set<int> st = {1,2,3}; for(auto x : st){ cout<<x<<" "; } return 0; }
迭代器版本代码无法运行的原因
你写的迭代器版本存在3个语法和逻辑错误,导致无法正常编译运行:
- for循环终止条件写错:循环遍历的是迭代器
x,终止判断应该校验迭代器是否走到容器末尾,也就是x != st.end()。你写的st!=end()是拿set容器本身和无归属的end()做比较,编译器无法识别,逻辑上也完全不成立。 - 非法的迭代器运算:
set、map这类关联容器的迭代器是双向迭代器,不支持随机访问的算术运算,只有vector、string这类连续内存容器的随机访问迭代器才支持it - n的写法,你写的st.end()-2属于非法操作,会直接触发编译错误。 - 未对迭代器解引用:迭代器是指向元素的类似指针的对象,直接
cout << x输出的是迭代器本身而非元素值,需要写成*x才能拿到对应的元素内容。
通用无末尾空格输出实现
下面的写法兼容所有标准容器,不需要迭代器支持随机访问,也不需要额外判断最后一个元素,逻辑稳定:
#include <iostream> #include <set> using namespace std; int main() { set<int> st = {1,2,3}; for(auto it = st.begin(); it != st.end(); it++){ // 非首个元素输出前先打空格,避免末尾留空格 if(it != st.begin()){ cout << " "; } cout << *it; } return 0; }
如果要适配范围for写法,可以加一个标记位判断是否是第一个元素即可:
bool is_first = true; for(auto x : st){ if(!is_first){ cout << " "; } is_first = false; cout << x; }
内容的提问来源于stack exchange,提问作者Jee
相关产品推荐
相关产品推荐

