32

私のコードには、その「数値」のようなsthをstringstreamに追加するループがあります。それが終わったら、ループを繰り返す場合は、'、' add'}'を抽出し、'{'を追加する必要があります。

無視()を使用して「」を削除できると思いましたが、機能しませんでした。私が説明することをどのように行うことができるか知っていますか?

例:

douCoh << '{';
for(unsigned int i=0;i<dataSize;i++)
  if(v[i].test) douCoh << i+1 << ',';
douCoh.get(); douCoh << '}';
4

9 に答える 9

58

を使用して、を探してstringstream1文字戻ることができstringstream::seekpます。最後の文字は削除されず、書き込みヘッドのみが移動することに注意してください。この場合、最後の文字を。で上書きするため、これで十分}です。

douCoh << '{';
for(unsigned int i=0;i<dataSize;i++)
  if(v[i].test) douCoh << i+1 << ',';
douCoh.seekp(-1,douCoh.cur); douCoh << '}';
于 2014-10-21T17:13:37.003 に答える
41

(メンバーを使用して)文字列を抽出し、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 << '}';
于 2010-12-28T13:55:07.197 に答える
32

私はこの非常に問題を抱えていました、そして私はあなたが簡単にできることを知りました:

douCoh.seekp(-1, std::ios_base::end);

そして、データを挿入し続けます。他の人が述べたように、そもそも悪いデータを挿入しないことはおそらく理想的な解決策ですが、私の場合はサードパーティのライブラリ関数の結果であり、データを文字列にコピーすることも避けたかったのです。

于 2016-02-22T17:48:28.533 に答える
6
stringstream douCoh;
for(unsigned int i=0;i<dataSize;i++)
  if(v[i].test)
    douCoh << ( douCoh.tellp()==0 ? '{' : ',' ) << i+1;
douCoh << '}';
于 2011-12-07T23:37:14.107 に答える
5

私はpop_back()c++11以来、文字列のメソッドを使用してこの方法を見つけました。おそらく上記の賢いものほど良くはありませんが、はるかに複雑なケースや怠惰な人々に役立ちます。

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 << '}';
于 2013-04-10T10:35:33.250 に答える
2

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';
}
于 2010-12-28T15:33:11.250 に答える
1

カウンターをチェックしてみませんか?そして、「、」を挿入しないでください

douCoh << '{';
for(unsigned int i=0;i<dataSize;i++){
  if(v[i].test){
    douCoh << i+1;
    if(i != dataSize - 1) douCoh << ',';
  }
}
/*douCoh.get();*/ douCoh << '}';
于 2010-12-28T14:00:45.743 に答える
1

std::string::erase基になる文字列から直接最後の文字を削除するために使用できます。

于 2010-12-28T12:33:38.170 に答える
1
#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;   
}
于 2019-06-25T14:54:08.853 に答える