0

STL を使用してコンテナー内の double の合計を見つける単純な合計関数テンプレートを作成しようとしています。まず、これをリストでテストしようとしていますが、28 行目でエラーが発生し続けます。

#include <iterator>
#include <list>    
#include <iostream>

using namespace std;

template <typename T>
double Sum(typename T& container)
{// sum of a container with doubles
    typename T::const_iterator iterator_begin = container.begin();
    typename T::const_iterator iterator_end = container.end();

    double my_sum = 0;

    for (iterator_begin; iterator_begin != iterator_end; iterator_begin++)
        my_sum += iterator_begin->second; // this is line 28

        return my_sum;
}

int main()
{
    list<double> test_list(10,5.1); // create a list of size 10 with values 5.1

    cout << Sum(test_list) << endl;

    return 0;
}

2 つのコンパイラ エラーが発生します。

c:\users...\iterators.cpp(28): エラー C2839: オーバーロードされた 'operator ->' の戻り値の型 'const double *' が無効です

c:\users...\iterators.cpp(28): エラー C2039: 'second' : 'std::_List_const_iterator<_Mylist>' のメンバーではありません

const_iterator から iterator に変更しても、同様のエラーが発生します。

エラー C2839: オーバーロードされた 'operator ->' の戻り値の型 'double *' が無効です

ここで間違ったポインタを使用していますか?ありがとう!

4

1 に答える 1

1

STL リストは「秒」の概念をサポートしていません。それらは単純なシーケンスです。これはもともと std::map<> 用に調整されたようです。そうは言っても、リスト、ベクター、キューなどがターゲット コンテナーである場合は、次のようになります。

これを変える:

my_sum += iterator_begin->second;

これに:

my_sum += *iterator_begin;

そして、それは明らかにあなたが望むように機能します。こののことを STL で行うための組み込みアルゴリズム (for_each など) があり、それらを潜在的な代替手段と見なす必要があります。

編集: OP は、単純なシーケンスとマップの両方の合計を特殊化する方法を求めました。

#include <iostream>
#include <list>
#include <map>

using namespace std;

// general summation
template<typename T>
double Sum(const T& container)
{
    double result = 0.0;
    typename T::const_iterator it = container.begin();
    while (it != container.end())
        result += *it++;
    return result;
}

// specialized for a map of something-to-double
template<typename Left>
double Sum(const map<Left,double>& themap)
{
    double result = 0.0;
    typename map<Left,double>::const_iterator it = themap.begin();
    while (it != themap.end())
        result += (it++)->second;
    return result;
}

// a list of doubles.
typedef list<double> DblList;

// a map of int to double
typedef map<int, double> MapIntToDbl;

// and just for kicks, a map of strings to doubles.
typedef map<string, double> MapStrToDbl;


int main(int argc, char** argv)
{
    DblList dbls;
    dbls.push_back(1.0);
    dbls.push_back(2.0);
    dbls.push_back(3.0);
    dbls.push_back(4.0);
    cout << "Sum(dbls) = " << Sum(dbls) << endl;

    MapIntToDbl mapdbls;
    mapdbls[1] = 1.0;
    mapdbls[2] = 2.0;
    mapdbls[3] = 3.0;
    mapdbls[4] = 4.0;
    mapdbls[5] = 5.0;
    cout << "Sum(mapdbls) = " << Sum(mapdbls) << endl;

    MapStrToDbl mapdbls2;
    mapdbls2["this"] = 1.0;
    mapdbls2["is"] = 2.0;
    mapdbls2["another"] = 3.0;
    mapdbls2["map"] = 4.0;
    mapdbls2["sample"] = 5.0;
    cout << "Sum(mapdbls2) = " << Sum(mapdbls2) << endl;

    return 0;
}
于 2012-09-30T18:47:25.330 に答える