从stringstream中删除char并附加一些数据

lor*_*ger 19 c++ stringstream

在我的代码中有一个循环,它将"number"添加到stringstream.当它结束时,我需要提取','添加'}'并添加'{'如果要重复循环.

我以为我可以使用ignore()删除','但它不起作用.你知道我怎么做我描述的吗?

例:

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

Syl*_*sne 34

您可以提取字符串(使用该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 << '}';
Run Code Online (Sandbox Code Playgroud)

  • “更好”取决于上下文并包括主观考虑。避免在序列末尾出现单个多余的逗号通常需要向循环添加额外的状态和额外的比较,从而导致多次迭代的执行速度变慢。在许多情况下,只需在循环结束后删除/替换一个多余的尾随字符就会产生更干净、更小且更快的代码。 (6认同)
  • 我不明白为什么这个相当笨重的解决方案会被接受,特别是当问题最终(“更好”)被回避时。 (2认同)

bcm*_*inc 33

您可以使用,查找stringstream并返回1个字符stringstream::seekp.请注意,它不会删除最后一个字符,而只会移动写头.在这种情况下,这就足够了,因为我们用一个覆盖最后一个字符}.

douCoh << '{';
for(unsigned int i=0;i<dataSize;i++)
  if(v[i].test) douCoh << i+1 << ',';
douCoh.seekp(-1,douCoh.cur); douCoh << '}';
Run Code Online (Sandbox Code Playgroud)


jde*_*esa 17

我遇到了这个问题,我发现你可以做到:

douCoh.seekp(-1, std::ios_base::end);
Run Code Online (Sandbox Code Playgroud)

并保持插入数据.正如其他人所说,避免首先插入坏数据可能是理想的解决方案,但在我的情况下是第三方库函数的结果,我也想避免将数据复制到字符串.

  • 请记住,它不会从缓冲区中删除数据,因此您需要覆盖该数据。 (2认同)

Dar*_*ioP 6

自 c++11 以来,我已经使用pop_back()string 的方法找到了这种方法。可能不如上面更聪明的人那么好,但在更复杂的情况和/或对于懒惰的人来说很有用。

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 << '}';
Run Code Online (Sandbox Code Playgroud)


小智 5

stringstream douCoh;
for(unsigned int i=0;i<dataSize;i++)
  if(v[i].test)
    douCoh << ( douCoh.tellp()==0 ? '{' : ',' ) << i+1;
douCoh << '}';
Run Code Online (Sandbox Code Playgroud)