区切り文字が最後の要素に配置されないように std::ostream_iterator (または同様のもの) を使用する方法はありますか?
#include <iterator>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int main(int argc, char *argv[]) {
std::vector<int> ints = {10,20,30,40,50,60,70,80,90};
std::copy(ints.begin(),ints.end(),std::ostream_iterator<int>(std::cout, ","));
}
印刷します
10,20,30,40,50,60,70,80,90,
区切り文字の末尾を避けようとしています。印刷したい
10,20,30,40,50,60,70,80,90
確かに、ループを使用できます。
for(auto it = ints.begin(); it != ints.end(); it++){
std::cout << *it;
if((it + 1) != ints.end()){
std::cout << ",";
}
}
しかし、C++11 の範囲ベースのループを考えると、これは位置を追跡するのが面倒です。
int count = ints.size();
for(const auto& i : ints){
std::cout << i;
if(--count != 0){
std::cout << ",";
}
}
Boost を使用することにオープンです。boost::algorithm::join()を調べましたが、int を文字列にコピーする必要があったため、2 行でした。
std::vector<std::string> strs;
boost::copy(ints | boost::adaptors::transformed([](const int&i){return boost::lexical_cast<std::string>(i);}),std::back_inserter(strs));
std::cout << boost::algorithm::join(strs,",");
理想的には、 std::algorithm を使用し、範囲内の最後の項目に区切り記号を付けないようにしたいだけです。
ありがとう!