您可能想要定义一个通用函数来输出前向可迭代范围。这是我使用的 join() 函数:
template<typename ForwardIter>
std::string join(const ForwardIter& it1, const ForwardIter& it2, const std::string& separator=" ") {
if(it1 != it2) {
std::ostringstream s;
s << *it1;
for(ForwardIter i=it1+1; i!=it2; i++) s << separator << *i;
return s.str();
}
else return "";
}
template<typename Range>
std::string join(const Range& r, const std::string& separator=" ") { return join(r.begin(), r.end(), separator); }
该函数返回一个字符串,它应该采用任何向前可迭代的范围,例如列表、向量、集合等,其中每个元素的取消引用可以由 ostream 单独输出。使用此功能,您可以像这样使用它:
list<int> a = {1,2,3,4};
set<int> b = {4,3,2,1};
vector<int> c = {1,2,3,4};
cout << join(a) << endl;
cout << join(b, ",") << endl;
cout << join(c.begin(), c.begin()+2, "~") << endl;
我记得 join() 名称可能会与某些命名空间发生冲突,因此您可能希望将名称更改为类似的名称,例如加入或联合。此外,如果您曾经使用过 boost,您可能希望使用 boost::begin(r) 而不是 r.begin() 以获得更好的兼容性。