0

MultiMap が STL で「日付」、「価格」などの形式 (たとえば 07/10/2013 1000) で金融市場データを格納するのに最適なコンテナーであるかどうかを理解したいと思います。どちらが実装であるかを理解するために簡単な例を作成しようとしましたが、それらを印刷しようとすると恐ろしいエラーが発生しました。

  class  Date {
    int day;
    int month;
    int year;
    int value_of_date;

  public:
  Date(int d, int m, int y):
      day(d),month(m),year(y){
      value_of_date=year*10000 + month*100 + day;
      }

  friend ostream & operator<< (ostream &out, const Date &date);
  };
      ostream & operator<< (ostream &out, const Date &date) {
        out << "(" << date.day << ", " <<
        date.month << ", " <<
        date.year << ")";
        return out;
    }

  int main () {

     std::multimap<Date,int> first;

     first.insert(std::pair<Date,int>(Date(01,01,2000),1000));
     first.insert(std::pair<Date,int>(Date(01,02,2000),1010));
     first.insert(std::pair<Date,int>(Date(01,03,2000),1020));
     first.insert(std::pair<Date,int>(Date(01,04,2000),1030));

     for(auto i = first.cbegin(); i != first.cend(); i++) {
        std::cout << i->first << " " << i->second << std::endl;
     }
     return 0;
     }

比較 < operator() は私の問題ですか? < operator() を実装して日付をソートするにはどうすればよいですか。

Class Date を使用する代わりに、タイプ date のよりエレガントなソリューションはありますか?

これが金融市場データに最適なコンテナーである場合は?

助けてくれてありがとう

4

1 に答える 1

0

これを C++ で行う必要がありますか? 金銭的なことをするのは恐ろしい言語です。私を信じてください、私はそこにいました。

カスタム クラスをコンテナーに追加しようとしている場合は、要素に対するコンテナーの要件を調べる必要があります。たとえば、コンテナは多くの場合、コンテナに含まれるものを作成、削除、比較、並べ替え、値を割り当てる必要があるため、比較演算子を実装する必要があります (はい、演算子 < () はその一部です。演算子を実装するだけです)。 < (const YourClass& other) const ですが、コンテナー クラスを参照してください)、代入演算子、コピー コンストラクターなど。

これは、別の言語の方が簡単な理由の一部です。たとえば、Python は、これらの演算子のほとんどを自動的に導出します。さらに、ここ数年で、金融市場データの公式言語として SEC によって承認されました。Python、Java、Ruby、Perl、またはその他の主流の言語を選択することをお勧めします (特に、decimal クラスが付属している場合)。パフォーマンスが心配な場合は、NumPy を調べて、MySQL や mongodb などのデータベース バックエンドを使用してください。

しかし、何らかの理由 (おそらく巨大なデータ量とパフォーマンス) で C++ を使用する必要がある (信じている) 場合は、少なくともブースト (特にそのバリアント型) を使用し、STXXL を考慮してください。ただし、パフォーマンスが必要な場合は、最近では go がより賢明な選択になります。本当に、これに C++ を使用する唯一の理由は、強制されるクレイジーな会社で働いている場合です。

于 2013-10-08T00:01:56.123 に答える