19

これを行うためのより簡単な方法はありますか?

for_each(v_Numbers.begin(), v_Numbers.end(), bind1st(operator<<, cout));

for可能であれば、明示的なループなしで。

編集:

std::cin可能であればこれを行う方法はstd::vectorn(要素のみを読み取る方法)?

4

6 に答える 6

32

std::copyを使用してこれを達成できますstd::ostream_iterator

std::vector<int> v_Numbers; // suppose this is the type
// put numbers in
std::copy(v_Numbers.begin(), v_Numbers.end(),
          std::ostream_iterator<int>(cout));

いくつかの接尾辞を追加するとさらに良いでしょう:

std::copy(v_Numbers.begin(), v_Numbers.end(),
          std::ostream_iterator<int>(cout, "\n"));

これは、コンテナが であることを前提としているvector<int>ため、その部分を適切なタイプに置き換える必要があります。

入力の読み取りに関する編集:

std::istream_iterator逆に、範囲からvectorusingにコピーできますstd::back_inserter

std::vector<int> v_Numbers;
std::copy(std::istream_iterator<int>(cin), std::istream_iterator<int>(),
          std::back_inserter(v_Numbers));

n 要素のみを読み取りたい場合は、この質問を見てください。

于 2010-11-11T09:51:16.880 に答える
10

別のオプション — Boost.Lambda

for_each(v.begin(), v.end(), cout << boost::lambda::_1);
于 2010-11-11T10:00:23.187 に答える
7

はい、しかし std::copy アルゴリズムを使用する必要があります:

#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> a;
    // fill a...
    std::copy(a.begin(), a.end(), std::ostream_iterator<int>(std::cout));
}
于 2010-11-11T09:56:48.687 に答える
6

そうです、ラムダ式 (C++ 11) を使用して、STL コンテナーの各要素をインラインで印刷して cout にすることができます。

#include <iostream>   // cout
#include <vector>     // vector
#include <algorithm>  // for_each
#include <iterator>   // istream_iterator
using namespace std;

int main()
{
   std::vector<int> v(10,2);
   std::for_each(v.begin(), v.end(), [](int i)->void {std::cout << i <<endl;});
   return 0;
}

cin から vector への "n" 値の読み取りについては、

 int main()
 {
   std::vector<int> v;

   int elementsToRead;
   cin>>elementsToRead;  // Number of elements to copy

   // Reading from istream
   std::istream_iterator<int> ii2(std::cin);
   std::copy_n(ii2, elementsToRead, std::back_inserter(v));

   // printing updated vector
   std::for_each(v.begin(), v.end(), [](int i)->void {cout << i <<endl;});

   return 0;
}

(または) ラムダ式を使用する

std::for_each(std::istream_iterator<int>(cin),std::istream_iterator<int>(),[&v](int i)->void { v.push_back(i);});

ラムダ式についてもっと知りたい @ C++11 のラムダ式とは?

于 2017-05-02T14:58:15.470 に答える
0

企業コードでは必ずしも適切ではありませんが、オプションを列挙するために-他の for_each / std::copy などのソリューションが冗長すぎる場合は、次のように記述できます。

std::ostream& operator(std::ostream& os, const std::vector<My_Type>& v)
{
     // pick one of the other implementations for here...
    std::copy(std::istream_iterator<My_Type>(os), std::istream_iterator<My_Type>(),   
          std::back_inserter(v_Numbers));   
}

ベクトルの特定のインスタンス化のみをオーバーロードするだけの礼儀正しい (;-p) 場合は、はるかに優れています (これには、My_Type が int と言うために typedef 以上である必要がありますが、テンプレート化されたクラスを作成して新しい型を作成することは難しくありません)。任意の型をラップします)。そうしないと、他の誰かがあなたの翻訳単位の他の場所で同じことをすると、ストリーミングが曖昧になる可能性があります。

于 2010-11-11T10:40:12.777 に答える