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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:18:45