1

参考までに、これはC ++ソリューション: DavidVandevoordeによるC++プログラミング言語のコンパニオンで第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ステートメントを使用し、最後のエントリの後に「、」を出力しないようにする方がよいのではないかと考えていました。 。

私はカウトをロールバックすることを検討しましたが、それは不可能のようです。私が集めたものから、seekp()はcoutでは機能しません。

または、誰かがベクトルを印刷する別の興味深い方法を持っているなら、私はそれを聞いてうれしいです。

Vandervoordeの残りの解決策やStroustrupの本の演習を見たい人がいたら、喜んで投稿します(完全な演習と解決策を本から投稿することによる著作権の問題を除いて)。Vandervoordeの残りのコードを投稿する必要はないと感じました

また、これが私の最初の質問ですので、何か間違ったことをしたり、眉をひそめたりした場合は、遠慮なくお知らせください。

ありがとう

4

2 に答える 2

3

別の出力イテレータを使用できます。たとえば、infix_ostream_iteratorfromcomp.lang.c++のこの非常に便利な実装を検討してください。Jerry Coffinも、 「リストをコンマで印刷するC ++」への回答として、StackOverflowに投稿したようです。

于 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 に答える