私のコードには、その「数値」のようなsthをstringstreamに追加するループがあります。それが終了したら、ループを繰り返す場合は、「、」を追加し、「}」を追加して「{」を追加する必要があります。
Ignore()を使用して 'を削除できると思いましたが、機能しませんでした。私が説明することをどのように行うことができるか知っていますか?
例:
douCoh << '{';
for(unsigned int i=0;i<dataSize;i++)
if(v[i].test) douCoh << i+1 << ',';
douCoh.get(); douCoh << '}';
文字列を抽出し( str()
メンバーを使用)、最後の文字を std::string::erase
で削除してから、新しい文字列をバッファーとしてリセットします std::ostringstream
へ。
ただし、より良い解決策は、最初に余分な','
を挿入しないことです。
std::ostringstream douCoh;
const char* separator = "";
douCoh << '{';
for (size_t i = 0; i < dataSize; ++ i)
{
if (v[i].test)
{
douCoh << separator << i + 1;
separator = ",";
}
}
douCoh << '}';
stringstream::seekp
を使用して、stringstream
を検索し、1文字戻ることができます。最後の文字は削除されず、書き込みヘッドのみが移動することに注意してください。この場合は、最後の文字を}
で上書きするので、これで十分です。
douCoh << '{';
for(unsigned int i=0;i<dataSize;i++)
if(v[i].test) douCoh << i+1 << ',';
douCoh.seekp(-1,douCoh.cur); douCoh << '}';
私はこの非常に問題を抱えており、あなたが簡単にできることがわかりました:
douCoh.seekp(-1, std::ios_base::end);
そして、データを挿入し続けます。他の人が述べたように、最初に不良データを挿入しないことはおそらく理想的なソリューションですが、私の場合はサードパーティのライブラリ関数の結果であり、データを文字列にコピーすることも避けたかったです。
stringstream douCoh;
for(unsigned int i=0;i<dataSize;i++)
if(v[i].test)
douCoh << ( douCoh.tellp()==0 ? '{' : ',' ) << i+1;
douCoh << '}';
C++ 11以降、pop_back()
文字列のメソッドを使用してこの方法を見つけました。おそらく上記の賢いものほど良くはありませんが、はるかに複雑なケースや怠惰な人々に役立ちます。
douCoh << '{';
for(unsigned int i=0;i<dataSize;i++)
if(v[i].test) douCoh << i+1 << ',';
string foo(douCoh.str());
foo.pop_back();
douCoh.str(foo);
douCoh.seekp (0, douCoh.end);
douCoh << '}';
Std :: copy、イテレータ、トレイトを楽しんでください。データが逆反復可能(end-1)であるか、出力を巻き戻すことができると想定する必要があります。巻き戻しが簡単だったと思います。
#include <ostream>
#include <algorithm>
#include <iterator>
namespace My
{
template<typename Iterator>
void print(std::ostream &out, Iterator begin, Iterator end)
{
out << '{';
if (begin != end) {
Iterator last = end - 1;
if (begin != last) {
std::copy(begin, last, std::ostream_iterator< typename std::iterator_traits<Iterator>::value_type >(out, ", "));
}
out << *last;
}
out << '}';
}
}
#include <iostream>
int main(int argc, char** argv)
{
My::print(std::cout, &argv[0], &argv[argc]);
std::cout << '\n';
}
std::string::erase
基になる文字列から直接最後の文字を削除します。
カウンターをチェックしてみませんか?そして、「、」を挿入しないでください
douCoh << '{';
for(unsigned int i=0;i<dataSize;i++){
if(v[i].test){
douCoh << i+1;
if(i != dataSize - 1) douCoh << ',';
}
}
/*douCoh.get();*/ douCoh << '}';
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>
template<typename T>
std::string implode(std::vector<T> vec, std::string&& delim)
{
std::stringstream ss;
std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(ss, delim.c_str()));
if (!vec.empty()) {
ss.seekp(-1*delim.size(), std::ios_base::end);
ss<<'\0';
}
return ss.str();
}
int main()
{
std::cout<<implode(std::vector<std::string>{"1", "2", "3"}, ", ");
return 0;
}