※ ChatGPTを利用し、要約された質問です(原文:vectorを使用したときのクラス定義について)
C++のvectorを使用したクラス定義について
このQ&Aのポイント
C++のSTLのvectorを使用してクラスオブジェクトを保存する際に、オブジェクトの比較演算子(<, ==)のオーバーロードが必要となる。
オーバーロードが必要な理由は、vectorが要素をソートしたり一致する要素を検索する際に比較演算子を使用するため。
一部のコンパイラでは他の比較演算子の定義も必要とされることがある。
現在C++で、STLのvectorを学習しているのですが、
本を見ると
ベクトルに保存されるクラスオブジェクトについて
「"<" および "=="を定義する必要がある」
っと書いてあります。
実際のサンプルなどでは、(長くなってしまってすみません)
// ベクトルにクラスオブジェクトを保存する
#include <iostream>
#include <vector>
using namespace std;
class Demo {
double d;
public:
Demo() { d = 0.0; }
Demo(double x) { d = x; }
Demo &operator=(double x) {
d = x; return *this;
}
double getd() { return d; }
};
bool operator<(Demo a, Demo b)
{
return a.getd() < b.getd();
}
bool operator==(Demo a, Demo b)
{
return a.getd() == b.getd();
}
int main()
{
vector<Demo> v;
int i;
for(i=0; i<10; i++)
v.push_back(Demo(i/3.0));
for(i=0; i<v.size(); i++)
cout << v[i].getd() << ' ';
cout << endl;
for(i=0; i<v.size(); i++)
v[i] = v[i] .getd() * 2.1;
for(i=0; i<v.size(); i++)
cout << v[i].getd() << ' ';
cout << endl;
return 0;
}
っというように書かれています。
ここで、なぜ<や==演算子をオーバーロードする必要があるのかが わかりません。
VC6.0やbccコンパイラで、演算子のオーバーロード箇所をコメントにしても通ってしまいます。
また、本には、「コンパイラによってはその他の比較演算子の定義も必須とされています」っとあります。
お手数おかけしますが、この辺りのことを簡単に(初心者なので・・・)教えていただけたら。と思います。
よろしくお願いします。
お礼
お返事ありがとうございます。 やはり、そう読み代えると納得できそうです。 つまらないことで、時間をかけずに済みました。 ありがとうございます。