2

vector、deque、list などのさまざまなコンテナー タイプで使用でき、さまざまなデータ型 ( integers 、 double または string ) で呼び出すことができるテンプレート関数を作成したいのですが、検索しましたが見つかりませんでした答え、私はこのようにしてみましたが、エラーが発生しています:

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <iterator>
#include <string>

using namespace std;
template <typename C>
void printvec(const C& numbers1)
//void printvec(container C<typename C::valuetype T>)
{
    //C &numbers1;
    for(auto i=0; i < numbers1.size(); ++i)
        cout<<&numbers1<<endl;
    //typename C<A>::iterator itr;
    //for ( itr=numbers1.begin();itr != numbers1.end(); ++itr)
      //  cout<<*itr<<endl;
}

int main()
{
    vector<int> vint{2,4,6,8,9,3};
    vector<double> vdouble{5.8, 6.7, 7.3};
    vector<string> vstring {"alex", "bbb", "cccc"};
    list<int> ls{1,2,3,4,5};
    printvec(vint );
    printvec(vdouble);
    printvec(vstring);
    printvec(ls);
        return 0;
}

それで、それを行う正しい方法は何ですか?

4

4 に答える 4

3

これから関数を作成する必要はありません。標準ライブラリには、これに必要なすべてのツールが既に含まれています。

 std::copy(vec.begin(),vec.end(),
     std::ostream_iterator(cout,"\n"));

C++11 を自由に使用できる場合は、std::begin(vec)代わりにvec.begin()同じものを使用してくださいend。@AndyProwl が正しく指摘しているように、より一般的です。

于 2013-02-25T22:20:45.390 に答える
2

他の人は、なぜライブラリ関数を使用する必要があるのか​​、そしてなぜ車輪の再発明をしているのかを指摘しています。あなたがそれをしたいのであれば、これがあなたがそれを書くべきだった方法です。

コンテナーは、抽象基本クラスではなく、構文構造に必要な構文と期待されるセマンティクスを指定する汎用インターフェース(これらは概念と呼ばれます)で指定されます。最も一般的なのはContainerで、より特殊なものはSequenceContainerです。テンプレート引数としてを受け入れる場合SequenceContainerは、テンプレート引数を使用するコードをそれらの要件に制約する必要があります。あなたの場合:

template<typename SequenceContainer>
void print(const SequenceContainer& seq)
{
  // being able to use range-for loops 
  // is a consequence of being a SequenceContainer
  for(auto& i : seq) {
    std::cout << i << " ";
  }
  std::cout << std::endl;

  // alternatively
  using std::begin; // enable ADL fallback for arrays
  using std::end;
  for(auto it = begin(seq); it != end(seq); ++it) {
    std::cout << *it << " ";
  }
  std::cout << std::endl;
}

優れたテンプレートコードを書くことは気の弱い人向けではないので、最初に基本的なC++をよりよく理解することを検討することをお勧めします。

于 2013-02-25T22:34:52.860 に答える
1

汎用コンテナーを反復処理する独自の関数を本当に作成する必要がある場合、これはおそらく標準コンテナーで動作する最も簡単な方法です。

template <typename C>
void print(const C& c)
{
    for (auto const& e : c) 
    { 
        cout << e << endl; 
    }
}

しかし、us2012が正しく指摘したように、車輪を再発明する必要はありません。

于 2013-02-25T22:27:48.600 に答える
0

これがまさに、標準ライブラリにfor_eachのようなアルゴリズムがある理由です。コンテナー自体の代わりに、開始イテレーターと終了イテレーターを渡します。3 番目の引数として渡すテンプレート化された関数が処理を行います。

于 2013-02-25T22:23:47.630 に答える