1

作为参考,我在C++ Solutions: Companion to The C++ Programming Language by David Vandevoorde 在第 10 章练习 19 的答案中找到了这一点

为了输出函数的结果,他使用这段代码利用复制算法打印出向量

map<string, vector<int> > *index = make_line_index(cin, entries);
vector<string>::iterator p = entries->begin();
for(; p!=entries.end(); ++p) {
   cout << "Word " << *p << " appears in lines ";
   map<string, vector<int> >::iterator lines = index->find(*p);
   std::copy((*p).second.being(), (*p).second.end(),
             ostream_iterator<int>(cout, ", "));
   cout << ".\n";
}

这似乎是打印出矢量的一种非常好的方法,但我唯一的问题是输出最终会出现一些我似乎无法摆脱的格式丑陋

示例输出:

 Word cat appears in lines 1, 2, .
 Word dog appears in lines 3, .

我想知道是否有一种简单的方法可以解决这个问题并仍然使用该算法,或者最好回到使用 for 循环并使用 if 语句来确保我不会在最后一个条目之后打印“,” .

我研究了回滚 cout,但似乎那是不可能的。根据我收集的信息,seekp() 不适用于 cout。

或者,如果有人有另一种有趣的方式来打印矢量,我会很高兴听到它。

如果有人想查看 Vandervoorde 的其余解决方案或 Stroustrup 书中的练习,我很乐意发布它(除非在发布书中的完整练习和解决方案时出现任何版权问题)。我觉得没有必要发布 Vandervoorde 的其余代码

另外,这是我在这里的第一个问题,所以如果我做错了什么或不满意,请不要犹豫通知我。

谢谢

4

2 回答 2

3

您可以使用不同的输出迭代器,例如,考虑这个非常有用的infix_ostream_iteratorfrom comp.lang.c++ 实现。看起来Jerry Coffin也在 Stack Overflow 上发布了它,以回答“使用逗号 C++ 打印列表”。

于 2012-06-09T21:16:42.597 回答
1

恕我直言,你们正在使一件简单的事情变得不必要地复杂化

//populate a vector
std::vector< int > vints;
for(int k= 0; k<4; k++ )
    vints.push_back( k );

// print out with commas between elements
// but not after last one
for( int k=0;k <vints.size()-1;k++)
    cout << vints[k] << ", ";
cout << vints.back() << endl;
于 2012-06-09T21:54:29.973 回答