我想使用std::copy
和std::ostream_iterator
打印出vector
内的字符串作为括号内的逗号分隔列表。所以我必须处理在最后一个元素之后删除", "
的问题。
我试过this:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
int main() {
std::vector<std::string> v;
v.push_back("a");
v.push_back("b");
v.push_back("c");
std::stringstream os;
os << '(';
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(os, ", "));
os.seekp(-2, std::ios_base::cur);
os << ')';
std::cout << os.str() << ".";
return 0;
}
输出:
(a, b, c) .
^
但是我得到的输出在右括号后面有一个额外的空格字符,因为seekp
只是移动书写位置但不删除书写字符。
有没有办法删除最后一个字符或写一个EOF?
答案 0 :(得分:6)
如何不在最后写出额外的", "
......
if(!v.empty())
{
std::copy(v.begin(), v.end()-1, std::ostream_iterator<std::string>(os, ", "));
os << v.back();
}
答案 1 :(得分:1)
使用seekp
时,您不只是删除字符,而是设置当前光标。您的下一个语句将覆盖该字符,但您仍然在缓冲区中有后续字符。有几种方法可以解决这个问题:
不输出完整模式:
std::ostringstream os;
os << '(';
std::copy(v.begin(), v.end() - 1, std::ostream_iterator<std::string>(os, ", "));
if (v.size() > 1) // or (!v.empty())
os << *(v.end() - 1) << ')';
这将打印除了矢量的最后一个字符以外的所有字符(额外的“,”组合将完全避免)。
或者,您可以手动重置缓冲区:
std::ostringstream os;
os << '(';
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(os, ", "));
std::string t = os.str();
t.resize(t.size() - 2);
os.str() = t;
os << ')';
或者,也许是更统一的解决方案(如果您不反对不使用副本):
std::ostringstream os;
os << '(';
if (v.size() > 1) // or (!v.empty())
os << v.front();
std::for_each(v.begin() + 1, v.end(), [&](const std::string& s)
{
os << ", " << s;
});
os << ")";