偶然的你
使用std :: for_each和lambda可以做一些有趣的事情。#include <iostream>#include <sstream>int main(){ int array[] = {1,2,3,4}; std::for_each(std::begin(array), std::end(array), [&std::cout, sep=' '](int x) mutable { out << sep << x; sep=','; });}请参阅我写的一堂小课的这个问题。这不会打印结尾的逗号。同样,如果我们假设C ++ 14将继续为我们提供基于范围的等效算法,如下所示:namespace std { // I am assuming something like this in the C++14 standard // I have no idea if this is correct but it should be trivial to write if it does not appear. template<typename C, typename I> void copy(C const& container, I outputIter) {copy(begin(container), end(container), outputIter);}}using POI = PrefexOutputIterator; int main(){ int array[] = {1,2,3,4}; std::copy(array, POI(std::cout, ",")); // ",".join(map(str,array)) // closer}
侃侃无极
另一种选择是使用std::copy和ostream_iterator类:#include <iterator> // ostream_iterator#include <sstream> // ostringstream#include <algorithm> // copystd::ostringstream stream;std::copy(array.begin(), array.end(), std::ostream_iterator<>(stream));std::string s=stream.str();s.erase(s.length()-1);还不如Python好。为此,我创建了一个join函数:template <class T, class A>T join(const A &begin, const A &end, const T &t){ T result; for (A it=begin; it!=end; it++) { if (!result.empty()) result.append(t); result.append(*it); } return result;}然后像这样使用它:std::string s=join(array.begin(), array.end(), std::string(","));您可能会问为什么我传递了迭代器。好吧,实际上我想反转数组,所以我这样使用它:std::string s=join(array.rbegin(), array.rend(), std::string(","));理想情况下,我想模板化到可以推断char类型并使用字符串流的地步,但是我还不能弄清楚。