2

開始イテレータと終了イテレータの 2 つのイテレータを取得する特定のコンストラクタを作成する必要があります。

私はいくつかのコードとその作品を持っています:

#include <iostream>
#include <vector>

using namespace std;

template<typename T>
class A
{
public:
    T a[10];
    typename std::vector<T>::iterator itStart, itEnd;
    A(typename vector<T>::iterator itStart, typename vector<T>::iterator itEnd):itStart(itStart),itEnd(itEnd){}

    void see()
    {
        int i=0;
        while(itStart != itEnd)
        {
            cout<<*itStart<<endl;
            a[i] = *itStart;
            itStart++;
            i++;
        }
    }
};

template <typename Iterator>
double Sum( Iterator begin, Iterator end );

int main()
{
    cout << "Hello world!" << endl;
    vector<int> v;
    v.push_back(1);
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);


    class A<int> a(v.begin(),v.end());
    a.see();
    return 0;
}

しかし、コンストラクターの引数をすべての STL コンテナー (Set、List、Map など) と通常の配列 (通常のポインター) で機能させたいと考えています。では、一般的なテンプレートの方法で作成できますか? そんな感じ:

template<typename T>
class A
{
public:
    iterator<T> itStart, itEnd;
    A(iterator<T> itStart, iterator<T> itEnd):itStart(itStart),itEnd(itEnd){}

    void see()
    {
        while(itStart != itEnd)
        {
            cout<<*itStart<<endl;
            itStart++;
        }
    }
};

上記のコードが間違っていることは知っていますが、私の考えを説明したいと思います。

もちろん、コンストラクターをオーバーロードすることはできますが、私はそれが面倒です。STL コンテナーが多すぎます。その問題を解決するためのテンプレートの方法はありますか?

4

3 に答える 3

1

明らかに、イテレータ型をクラスのテンプレート引数にする必要があります

template<class T, class Iter>
class A
{
   Iter first, last;
   A(Iter first, iter last):first(first), last(last){}
};

しかし、テンプレート引数を明示的に指定するのは不快になります

A<int, vector<int>::iterator > a;

それを避けるには、単にファクトリ関数を作成します

   template<class T, class Iter>
   A<T, Iter> make_A(Iter first, iter last)
   {
       return A<T, Iter>(first, last);  
   }

ここで、A のオブジェクトを直接作成する代わりに、関数を使用できます。

   auto my_A =  make_A<int>(v.begin(), v.end());
于 2013-04-23T13:55:04.710 に答える
0

次のようなSTLのものの1つを見るstd::fill

template< class ForwardIt, class T >
void fill( ForwardIt first, ForwardIt last, const T& value );

私たちはインスピレーションを受けることができます:

template<typename ITR, typename T>
class A
{
  A(ITR itStart, ITR itEnd):itStart(itStart),itEnd(itEnd){}
  ...
于 2013-04-23T13:59:00.957 に答える