输出以空格分隔的列表

时间:2015-09-02 02:40:49

标签: c++ ostream

我正在重载运算符<<以空格分隔输出我的容器:

std::ostream& operator<< (std::ostream &os, const MyContainer &v)
{
    os << "[";
    for (const auto &i : v) {
        os << i << " ";
    }
    os << "\b]"; // <--
    return os;
}

MyContainer c{1,2,3};
std::cout<<c<<std::endl;

我正在使用'\ b'来避免列表末尾的额外空间,它可以正常使用上面的代码。

但这可能不是一个好主意,'\ b'是否适用于其他类型的ostream?还有其他想法输出这样的数据吗?

2 个答案:

答案 0 :(得分:2)

  

但这可能不是一个好主意,import json import csv string = open('sample.json').read().decode('utf-8') json_obj = json.loads(string) with open('rspns.csv','w') as f: writer = csv.writer(f,delimiter = '~') headers = ['ID','CODES','USER_ID'] writer.writerow(headers) id = json_obj['id'] user_id = json_obj['ctr']['user_id'] for code in json_obj['codes']: writer.writerow([id,code,user_id]) 是否适用于其他类型的'\b'

对于这不是一个好主意你是绝对正确的:ostream在控制台模式下工作正常,但它不能很好地与其他流一起使用,例如文件。

更好的方法是不首先输出额外的空间:

'\b'

答案 1 :(得分:1)

一个简单实用的解决方案是在范围循环之前添加一个空格:

std::ostream& operator<< (std::ostream &os, const MyContainer &v)
{
    os << "[ "; // <--
    for (const auto &i : v) {
        os << i << " ";
    }
    os << "]";
    return os;
}

MyContainer c{1,2,3};
std::cout<<c<<std::endl;

结果是略有不同的输出,但仍然实现了视觉上令人愉悦的对称格式的假设目标:而不是[1 2 3],您得到[ 1 2 3 ]。空列表将打印为[ ]