• 締切済み

ICPCの過去問

問題文↓ http://www.deqnotes.net/acmicpc/p0105/ja 答え↓ http://www.deqnotes.net/acmicpc/p0105/p0105-deq-sim.cpp です。 自分で調べたのですが、答えの中の int operator<(const Event &a) const { return time != a.time ? time < a.time : type > a.type; と、 ev.push_back(start); ev.push_back(end); の意味がよくわかりませんでした。 int operatorに関しては、sortの条件を作っているのかなとは思うのですが。 どなたか、上に挙げたふたつの部分の解説をしていただきたいです。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

「演算子のオーバーロード」を調べてください。 通常の < 演算子は、 a < b → aがbより小さければ1,そうでなければ0 という演算をします。 通常は数値同士の場合しか使えませんが、これをクラス等にも使えるようにするのが「演算子のオーバーロード」です。 なんでも定義できますが、元の演算子と同じ動作をさせるべきでしょう。 Event x,y ;なら x < y → xがyより「小さい」ならば1,そうでなければ0 という関数にするのが妥当です。 > <(const Event &a) constの部分は、<で引数が二つということを表しているのですか。 表していません。 「operator <」 がセットです。 引数は1つです。 > そして、{}内は、returnする内容を表しているのですか 聞かないとわからないことですか?

bcbcbc
質問者

お礼

回答者様たちのアドバイスのおかげで解決しました!ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

STL. sort は, 結果として得られる列において a, b の順に隣接する要素が (ちょっと不正確ですが) a < b を満たすように並べ替えるんだけど, 内部的に x < y という比較をするために演算子 < が必要です (ただし比較関数を与える 3引数バージョンもあって, そっちを使うことにすればこの演算子はなくてもいい). push_back は「最後尾に要素を追加する」メンバー関数です.

bcbcbc
質問者

お礼

回答者様たちのアドバイスのおかげで解決しました!ありがとうございました!

bcbcbc
質問者

補足

ありがとうございます。STLについて調べました。 int operator<(const Event &a) const { return time != a.time ? time < a.time : type > a.type; } では、上記の<(const Event &a) constの部分は、<で引数が二つということを表しているのですか。 そして、{}内は、returnする内容を表しているのですか。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

C++ をどのくらい理解できていますか?

bcbcbc
質問者

補足

>c++の理解度 基本的な入出力と、クラスについての基本的なことは理解できていると思います。 今回質問したことに関しては、何を理解すればよいのか、何を勉強すればよいのかがわかりませんでした。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • std::lower_boundについて

    こんにちは。 std::vector< int* > IntArray; IntArray.push_back( new int( 0 ) ); IntArray.push_back( new int( 2 ) ); IntArray.push_back( new int( 1 ) ); IntArray.push_back( new int( 6 ) ); IntArray.push_back( new int( 5 ) ); IntArray.push_back( new int( 7 ) ); というint型のポインタが格納されているIntArrayを bool cmp( const int* lhs, const int* rhs ) {   return *lhs < *rhs; } std::sort( IntArray.begin(), IntArray.end(), cmp ); として並べ替えたとします。 そこで新しく new int( 4 )をソートされた順番を壊さない位置に挿入したいと思いlower_boundを使用しようと思いました。 しかし、lower_boundの使い方がいまいちわかりません。 int *p = new int( 4 ); bool cmp2( const int* lhs, const int* rhs ) {   return *lhs < *rhs; } std::lower_bound(  IntArray.begin(),  IntArray.end(),  p,  cmp2 ); 上記のように使用すればこの場合だと変数pを挿入する位置が返ってくるのでしょうか? 間違えているとしたら、どのように修正すれば変数pを挿入できる位置が返ってくるように書き直すことができるでしょうか?(むしろそういった実装は可能なのでしょうか) よろしくお願いします。 今回は特殊ケースでの問題ですのでint* pをintに修正する、挿入してから再度ソートする、といったことはなしでお願いします。あくまでもlower_boundで実装する場合のコードについてでよろしくお願いします。 /*   VisualStudio 2008 academic edition   Window7 64bit */

  • const参照メンバを含む要素のvector

    久しぶりに趣味でプログラミングしてます。 const参照のメンバを含むオブジェクトを要素に持つvector って使えます? 下記はbcc32でコンパイルするとエラーが出ます。 _algobase.h 145:コンパイラは 'operator=' クラスの hoge を作成できない(関数 _STL::hoge * __copy<hoge *,hoge *,int>(hoge *,hoge *,hoge *,const random_access_iterator_tag &,int *) ) ちなみにv.clear();をコメントアウトするとコンパイルは通り実行も問題なくできます。 clear()の替わりにpop_back()としてもコンパイルは通り実行も問題なくできます。 コンパイラーのバグ?そもそもこんなことをしてはダメ? よろしくお願いします。 class hoge { public:  hoge(const int &i):_i(i){};  virtual ~hoge(){};  operator int () const {return _i;}  const int &_i; }; int main() {  int i1=1;  int i2=2;  hoge h1(i1);  hoge h2(i2);  std::vector<hoge > v;  v.push_back(h1);  v.push_back(h2);  v.clear();  std::vector<hoge >::iterator iter = v.begin();  while( iter != v.end() ){   std::cout << *iter << "\n";   ++iter;  }  return 0; }

  • ICPCの過去問

    ●問題→http://www.deqnotes.net/acmicpc/2684/ja ●模範解答→http://www.deqnotes.net/acmicpc/2684/2684-deq_1.cpp PKUに模範解答を提出すると、コンパイルエラーになります。なぜだか教えてください。 ●エラーの内容↓ Main.cpp F:\temp\11340104.347790\Main.cpp(17) : error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion) istream(1000): could be 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,signed char *)'  with [ _Elem=char, _Traits=std::char_traits<char> ] istream(1007): or 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,signed char &)' with [ _Elem=char, _Traits=std::char_traits<char> ] istream(1014): or 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,unsigned char *)' with [ _Elem=char, _Traits=std::char_traits<char> ] istream(1021): or 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,unsigned char &)' with [_Elem=char, _Traits=std::char_traits<char> ] istream(155): or 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::basic_istream<_Elem,_Traits> &(*)(std::basic_istream<_Elem,_Traits> &))' with [_Elem=char, _Traits=std::char_traits<char> ] istream(161): or 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::basic_ios<_Elem,_Traits> &(*)(std::basic_ios<_Elem,_Traits> &))' with [ _Elem=char, _Traits=std::char_traits<char> ] istream(168): or 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::ios_base &(*)(std::ios_base &))' with [ _Elem=char, _Traits=std::char_traits<char> ] istream(175): or 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::_Bool &)' with [ _Elem=char, _Traits=std::char_traits<char> ] istream(194): or 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(short &)' with [ _Elem=char, _Traits=std::char_traits<char> ] istream(228): or 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(unsigned short &)' with[ _Elem=char, _Traits=std::char_traits<char> ] istream(247): or 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(int &)' with [ _Elem=char, _Traits=std::char_traits<char> ] istream(273): or 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(unsigned int &)' with [ _Elem=char, _Traits=std::char_traits<char> ] istream(291): or 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(long &)' with [ _Elem=char, _Traits=std::char_traits<char> ] istream(309): or 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(__w64 unsigned long &)' with [_Elem=char, _Traits=std::char_traits<char> ] istream(329): or 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(__int64 &)' with [ _Elem=char, _Trait ・・・って感じでエラー文が続きます。全部入りきらなかったのでここまでとりあえず載せます。

  • コンテナ要素の削除について

    今vectorの勉強をしているのですが、要素を削除できなくて困っています。 下記のch1とch2において、 vector<int> ch1; vector<int> ch2; ch1.push_back(10); ch1.push_back(11); ch1.push_back(12); ch1.push_back(13); ch1.push_back(14); ch1.push_back(15); ch2.push_back(13); ch2.push_back(14); ch2.push_back(15); ch1とch2が一致する要素は削除して、一致しない値を得たいのですがどうしたらいいのでしょうか? 結果としては、 ch1に、10・11・12のみが残る感じです。 よろしくお願い致します。 int ch1_size = ch1.size(); int ch2_size = ch2.size(); vector<int>:: iterator itr1; itr1=ch2.begin(); for(int a=0;a<ch1_size;a++){ for(int b=0;b<ch2_size;b++){ if(ch1[a]==ch2[b]){ itr1+b; ch1.erase(itr1); } } }

  • operator * について

    掛け算ではない方の operator * についての質問です。 下のソースを見てください。関数func()内で、(*this)[idx]というやり方と、直接operator [] を呼び出すやり方を試しています。(*this)[idx]は自分のコピーを作ってしまわないでしょうか?このようなやり方は正しいでしょうか。というのが第1の質問です。 さらに、CTestで operator * を定義していますが、(*this)[idx]で呼び出されません。なぜなのでしょうか。というのが第2の質問です。 どうぞよろしくお願いいたします。 class CTest : public vector<int> { public: CTest() : vector<int>() { push_back(1); push_back(2); push_back(3); } void func() { #if 1 // 質問1 この書き方をしてもコピーが作られないかどうか? cout<<(*this)[0]<<endl; cout<<(*this)[1]<<endl; cout<<(*this)[2]<<endl; #else cout<<operator[](0)<<endl; cout<<operator[](1)<<endl; cout<<operator[](2)<<endl; #endif } CTest& operator * () { // 質問2 なぜこのオペレータが呼び出されないのか cout<<"???"<<endl; return *this; } }; void main(void) { CTest inst; inst.func(); }

  • C++言語 メンバ関数

    何気なく使用しているクラスのメンバ関数、これの中身が実際どうなってるか知りたいです。大別して2種類に分かれますので以下の2つを 教えて下さい。また詳しく載っているサイトなどあれば教えて下さい。 1,stringクラスMid(int start,int length関数と operator関数+について class String{ char *p; char *q; public: //各定義 }; String String::Mid(int start,int length) const { // } String String::operator+(const String&s)const{ return String(p+s.q+s.p); } 最初の方はイメージもつかず、2つめのほうはポインタに ポインタを加えようとしましたとでます。 教えて下さい。

  • 外部ファイルでのtemplate関数の実装方法

    外部ファイルでのtemplate関数の実装方法 sub.cppにtemplate関数を実装し、 main.cppで、sub.cppのtemplate関数を呼び出す、 みたいなことをやりたいのですが、 コンパイルは通りますが、リンクエラー?になってしまいます。 以下が上記のサンプルプログラムです。 //main.cpp #include <vector> #include <iostream> using namespace std; template <typename t_ret, typename t_array> t_ret sub_t(const t_array&); int main (int argc, char *argv[]) { vector<double> v; v.push_back(1.1); v.push_back(2.2); cout << sub_t<double, vector<double> >(v) << endl; return 0; } // sub.cpp #include <vector> using namespace std; template <typename t_ret, typename t_array> t_ret sub_t(const t_array& array) { return array[0]+array[1]; } //コンパイルログ main.o: In function `main': main.cpp:(.text+0x134): undefined reference to `double sub_t<double, std::vector<double, std::allocator<double> > >(std::vector<double, std::allocator<double> > const&)' collect2: ld returned 1 exit status make: *** [main] Error 1 どなたか、対処方法を教えてください。 宜しくお願いします。

  • dequeにconstが混ざったアイテムの削除

    こんにちわ。 関数のパラメータにpairのdequeを渡したときにfirstを変えてほしくないために 以下のようにプログラムを書きました。ただしdequeの中身自体は削除したいのですが、 エラーになってしまいます。 deque< pair< const int, int > > listTest ; pair< int, int > pairTest ; pairTest.first = 0 ; pairTest.second = 4 ; listTest.push_back( pairTest ) ; pairTest.first = 1 ; pairTest.second = 5 ; listTest.push_back( pairTest ) ; pairTest.first = 2 ; pairTest.second = 6 ; listTest.push_back( pairTest ) ; pairTest.first = 3 ; pairTest.second = 7 ; listTest.push_back( pairTest ) ; // ↓ エラー(こちらは自分の期待通り)。 listTest.begin()->first = 10 ; // secondは変更できる(こちらも自分の期待通り)。 listTest.begin()->second = 20 ; // ↓ エラー。 listTest.erase( listTest.begin()) ; 上記のリストでリストのアイテム自体は削除できるようにしたいのですが、うまく行きません。 テンプレート引数にconstが混ざるとリスト自体も削除できなくなってしまうのでしょうか ? もしエラーを解決できる方法をご存じの方がいらっしゃいましたら教えていただけないでしょうか。 よろしくお願いします。

  • 演算子オーバーロードのプログラムで

    今、C++でテンプレートクラスや演算子オーバーロードを使ったプログラムの練習をしているのですが、どうしてもうまく動かなく質問させてもらうことにしました。 大まかに言えば、int型のvalueを持ったDataというクラスを用意し、演算子+と-のオーバーロードによって、クラスの足し算引き算を可能にしよう。ということなのですが、 それぞれのオーバーロードした演算子ともに、addSubtractという+と-両方に対応した関数を呼ぶことで使おうと思っています。 コードは以下のようになっています。 1 #include <iostream> 2 3 using namespace std; 4 5 template<class Comparable> 6 class Data { 7  public: 8   Data(){value = 0;} 9   Data(int i){value = i;} 10   int value; 11   Data<Comparable> operator+(const Data<Comparable> &); 12   Data<Comparable> operator-(const Data<Comparable> &); 13   Data<Comparable> Data<Comparable>::addSubtract(const Data<Comparable> & rhs, int sign); 14 }; 15 16 template<class Comparable> 17 Data<Comparable> Data<Comparable>::addSubtract(const 18 Data<Comparable> & rhs, int sign) { 18   int value1=this->value; 19   int value2=rhs.value; 20   Data<int> result(value1+(sign*value2)); 21   return result; 22 } 23 24 template<class Comparable > 25 Data<Comparable> Data<Comparable>::operator+(const Data<Comparable> & rhs) { 26   return addSubtract(&rhs, 1); 27 } 28 29 template<class Comparable > 30 Data<Comparable> Data<Comparable>::operator-(const 31 Data<Comparable> & rhs) { 31   return addSubtract(&rhs, -1); 32 } 33 34 int main() { 35   Data<int> matrix1(2); 36   Data<int> matrix2(1); 37   cout<<"data1:"<<matrix1.value<<endl; 38   cout<<"data2:"<<matrix2.value<<endl; 39 40   Data<int> result1 = matrix1+matrix2; 41   cout<<"data1+data2"<<result1.value<<endl; 42 43   Data<int> result = matrix1-matrix2; 44   cout<<"data1-data2"<<result2.value<<endl; 45 } このコードを実行したところ、以下のようなエラーメッセージが表示されて動かすことができません。 add.cpp:41: instantiated from here add.cpp:26: error: invalid conversion from `const Data<int>*' to `int' add.cpp:26: error: initializing argument 1 of Data<Comparable>::Data(int) [with Comparable = int]' アドバイスをいただけるとありがたいです。

  • C++文字配列ソート関数を教えてください

    C++文字配列ソート関数を教えてください 配列に格納されている文字列をソートして完全一致するかを確認するロジックを作成したいのですが、上手くいきません。ネットなどでいろいろ調べたのですが>< 一応、以下に今の状態のソースを貼りました。 class StringSuzeLess { public; bool operator()( const std::string& Ihs, const std::string& rhs ) const { retrun ihs.size() < rhs.size(); } } int main() { // 文字列格納変数 chra str1[10][5+1]; char str2[10][5+1]; // 初期化 memset(str1, 0x00, sizeof(str1)); memset(str2, 0x00, sizeof(str2)); // 文字列設定 strcpy(str1[0], "AAAAA"); strcpy(str1[1], "BBBBB"); strcpy(str1[2], "CCCCC"); strcpy(str2[0], "CCCCC"); strcpy(str2[1], "BBBBB"); strcpy(str2[2], "AAAAA"); std::vector< std::string > vsmozi1; std::vector< std::string > vsmozi2; // ベクタに文字列設定 for(short LoopCnt = 0; LoopCnt < 3; LoopCnt++) { vsmozi1.push_back( std::string( str1[LoopCnt] ) ); } for(short LoopCnt = 0; LoopCnt < 3; LoopCnt++) { vsmozi2.push_back( std::string( str2[LoopCnt] ) ); } // ソート std::stable_sort( vsmozi1.begin(), vsmozi1.end(), StringSuzeLess()); std::stable_sort( vsmozi2.begin(), vsmozi2.end(), StringSuzeLess()); // ソート後の先頭から取得 for(short LoopCnt = 0; LoopCnt < 3; LoopCnt++) { // 不一致の場合 if(vsmozi1[LoopCnt] != vsmozi2[LoopCnt]) { return -1; } } return 0; }