• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:STLアルゴリズムについての質問)

STLアルゴリズムで月替わり要素の番号を取得する方法

このQ&Aのポイント
  • STLアルゴリズムを使用して、年月日データから月替わり要素の番号を取得する方法について教えてください。
  • vector<CString>に格納された年月日データから、月が切り替わる要素の番号を求めたいです。どのようなアルゴリズムを用いればよいでしょうか。
  • 年月日データのvectorから、月が変わる要素の番号を取得するためのSTLアルゴリズムについて教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

#include <afxwin.h> #include <iostream> #include <vector> #include <numeric> #include <iterator> using namespace std; struct diff_fn { CString operator()(const CString& x, const CString& y) const { return x.Left(6) == y.Left(6) ? "x" : "o"; } }; int main() { vector<CString> vec; vector<CString> dif; vec.push_back("20071001"); vec.push_back("20071002"); vec.push_back("20071101"); vec.push_back("20071102"); vec.push_back("20071103"); vec.push_back("20071201"); vec.push_back("20071202"); vec.push_back("20071203"); vec.push_back("20080101"); vec.push_back("20080102"); vec.push_back("20080103"); adjacent_difference(vec.begin(), vec.end(), back_inserter(dif), diff_fn()); for ( int i = 0; i < dif.size(); ++i ) { if ( dif[i] == "o" ) cout << i << endl; } }

perl_2005
質問者

お礼

epistemeさんお世話になります。 ありがとうございます。 とてもじゃないですが今の自分にはこのような コードは書けませんし、アルゴリズムの組み立てもできません 二項演算子でoまたはxを返すは目から鱗です(書いてもらったら理解できてもインスピレーションが沸きませんでした) 重ね重ねですが、大変ありがとうございました。

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

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

CStringの素性を補足してください。 また、 > 求めたい値 > 2, 5, 8 はどうやって出てきたのか、(見当は付きますが)念のため補足してください。

perl_2005
質問者

補足

jactaさんお世話になります >>CStringの素性を補足してください。 環境がVS2005MFCなのでCString型の文字変数を用いました >はどうやって出てきたのか 文字変数の4番目と5番目の値のことで、その値が前回の値と変化した場合、月替わりがあったと判断します、 EX: 0番目の要素20071001は2007年10月1日 1番目の要素20071002は2007年10月2日 2番目の要素20071101は2007年11月1日 以下省略 なので2番目の要素で月替わり発生という事です

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

関連するQ&A

  • STLベクトルコンテナ

    vectorの1次元目の要素と1次元目のサイズを常に持ち回す方法しか思いつきません。 int dim1size = 2; int dim1ite = 0; vector<vector<char *> > vec; vec.resize(dim1size); vec.at(dim1ite).reserve(2); どこかの関数で vec.at(dim1ite).push_back("浅倉"); vec.at(dim1ite).push_back("東京"); dim1ite++; どこかの関数で vec.at(dim1ite).push_back("稲垣"); vec.at(dim1ite).push_back("大阪"); dim1ite++; どこかの関数で vec.at(dim1ite).push_back("内山"); vec.at(dim1ite).push_back("名古屋"); dim1ite++; このようなソースです。 dim1sizeとdim1iteを持ち回さなくてもvecだけで1次元目のサイズを気にすることなくpush_backを実行するよい方法はありませんか? 上記ソースではpush_back("内山");の前にresizeが必要です。これを自動でやってほしいのです。

  • vectorで文字列の配列を使う方法

    vector<string>を使用せずpush_back("aaa")が使えるようなvector配列を用意することはできませんか? vector<char[4]> vec;ができたらうれしいのですがこれはコンパイルできませんでした。

  • vector間における効率的な値の比較

    2つのベクターに入ったdoubleの網羅的な比較を行う関数をC++で書こうとしています。 (VC++ 2008) doubleのベクター vctr_1 , vctr_2 があるとします。 vctr_1 には (100.0, 200.5 , 300.1 , 400.0 ) vctr_2 には(50.0 , 70.2, 100.1, 220.0 , 300.0 ) というdouble の値が入っていて vctr_1の値のうち、vctr_2に近い値(誤差0.2以内)が見つかるものを.新しいベクターとして返すという処理を考えています。 この場合 100 : 100.1 と300.1: 300.0 が 誤差 0.2 未満で近い値といえ、100 と300.1が格納されたベクターを返す、という処理です。 私の考えた方法はベクターaの各要素に対してベクターbの各要素をループで比較する、というものでした。 以下コード ---------------------------- //比較を行う関数。ベクター1、2 要素の比較をし誤差内の数値をベクター1からとりだし、別のベクターとして返す。 vector<double> compare_doubles_with_tol(vector<double> v1,vector<double> v2 , double tol ){ //似た値を格納するベクター vector<double> v_match; //ベクター1に関してループ vector<double>::iterator it1 = v1.begin(); while( it1 != v1.end() ){ //ベクター2に関してループ vector<double>::iterator it2 = v2.begin(); while( it2 != v2.end() ){ //誤差内の値を見つける if( fabs(*it1 - *it2) < tol ){ v_match.push_back(*it1); } ++it2; } ++it1; } return v_match; } int main() { //ベクター1 std::vector<double> vctr_1; vctr_1.push_back(100.0); vctr_1.push_back(200.5); vctr_1.push_back(300.1); vctr_1.push_back(400.0); //ベクター2 std::vector<double> vctr_2; vctr_2.push_back(50.0); vctr_2.push_back(70.2); vctr_2.push_back(100.1); vctr_2.push_back(220.0); vctr_2.push_back(300.0); //誤差0.2内で似た値があるものを新たなベクターとして得る。 vector<double> matched = compare_doubles_with_tol(vctr_1,vctr_2,0.2); for (int i = 0 ; i < matched.size() ; ++i){ cout << matched[i]<<endl; } return 0; } ------------------------- このコードで望んだ結果は得られますがループの繰り返しを行っていて処理が遅くなってしまいます。実際の仕事ではベクターの要素数が100前後のものを非常に数多く処理しなければならず、このままでは処理時間が膨大なものになってしまいそうです。 このような場合どのような処理、コードを作成すれば処理速度の向上が望めるでしょうか。

  • min_elementの三番目の引数

    ただいまSTLを勉強しているのですが、min_elementの三番目の引数の意味がわかりません。 iter min_element(iter first,iter last,pred pr); 以下のように使うのかなと自己解釈しましたが違うようです。 どうかご教授お願いします。 struct DATA{ int a; int b; }; main() { std::vector< DATA > data_vec; std::vector< DATA >::iterator it; for(int i=0;i<10;i++)//適当な数を10個プッシュバック { DATA data; data.a=rand(); data.b=rand(); data_vec.push_back(data); } //it = min_element(data_vec.begin(),data_vec.end(),DATA::a); }

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

    今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); } } }

  • Vectorから一部分を取り出す方法はありますか?

    教えていただきたいのですが、 1つのVectorの中に、いろいろなモノ(例えば、番号、名前、年齢のデータなど) が入っていたとして、そのVectorから番号だけ取り出して表示するなどということはできるでしょうか? /* 番号、名前、年齢を取得するメソッド(Vectorが戻り値)があるとして.... */ Vector vec = new Vector() ; str = number+name+age ; //これがたくさんあるとします vec.add(str) ;//番号と名前と年齢の組み合わせをVectorに格納 return vec ; /* 取りだし */ Vector vec=new Vector() ; vec = getVector() ; //メソッドから値を取りだし for(int i=0;i<vec.size();i++) { System.out.println(vec.elementAt(i)) ; } こんな感じだと、全部表示されてしまいます.... 部分ごとに取り出す方法はないでしょうか?初歩的な質問でごめんなさい、 よろしくお願いします!

    • ベストアンサー
    • Java
  • 継承元のpublicなメンバ関数を隠ぺいしたい

    C++です.(VC++2013) 親クラスではpublicで宣言されているメンバ関数があり,継承後はこのメンバ関数を隠ぺいしたいときはどのようにすればよいのでしょうか. 具体的には,std::vectorから派生したクラスを定義し,この独自クラスのインスタンスへ要素を追加する場合は,新しく独自に定義した関数を通じて行います. そのため,push_back()を呼べないようにしたいのです. 自分で作成した関数には,pushという名前をつけたいので,単純に自分の要素追加の関数をpush_backという名前でオーバーライドすることはできません. push関数内では,push_backした後,即座にsortしたいので,push_backをいう名前をつけたくないのです. とりあえずは,派生クラスでprivateにpush_backをオーバーライドし,自分で作った要素追加の関数で使うpush_backはstd::vectorのものを用いることを明示することでできました. 他にも何かやり方があれば,ご教授下さい.

  • c++のvector::erase

    vector::eraseについて質問させてください。 vector::eraseでググるとforループ内でのeraseの仕方は 書いていあるのですが、単純に1要素だけeraseする 例が見当たらなかったので教えてください。 1要素を削除する場合、 以下のような書き方でよろしいのでしょうか? いちおう正しく動作しているようです。 ただ、疑問なのは途中の要素[2]を削除しているので、 後半の要素が詰め直されているのか、 そのあたりが自信がなくて不安です。 vector<string> v; v.push_back("0a"); v.push_back("1a"); v.push_back("2a"); v.push_back("3a"); v.push_back("4a"); v.erase( v.begin() + 2 );//v[2]を削除 //結果表示 for(unsigned int i=0; i<v.size(); i++){ cout<<v[i]<<"\n"; } cout<<endl;

  • VC++のデバッガでvectorの要素をウォッチしたい

    VC++のデバッガでSTLのvectorの要素をウォッチするやり方があったのですが 方法を忘れてしまいました^^; 例えば vector<int> v; v.push_back(1); v.push_back(2); などのようにしておいて、 デバッグ中にウォッチウィンドウ上で v[1]の要素の内容を表示する方法があったのですが・・・ 確か、v[1]の頭に何か修飾したような記憶がありますが 定かではありません。 どなたかご存知の方、教えてください。 宜しく御願いします。

  • DLL内でnewしたインスタンスを外部で取得したい場合

    今、C++を使用して、 DLL内部でnewしたインスタンスをDLL外部(下記のmain()関数)で取得して参照するプログラムを書いています。 <ここからDLL内部> class clsTest { public:  clsTest();  ~clsTest(); }; class Vect { private:  std::vector<clsTest *> clsList; public:  Vect(){   clsTest *test01 = new clsTest();   clsTest *test02 = new clsTest();   clsTest *test03 = new clsTest();   this->clsList.push_back(test01);   this->clsList.push_back(test02);   this->clsList.push_back(test03);  };  ~Vect(){   std::vector<clsTest *>::iterator p = this->clsList.begin();   while(this->clsList.size() != 0){    delete this->clsList[0];    this->clsList.erase(p, p+1);   }  };  std::vector<clsTest *> getClsList(){   return (this->clsList);  }; }; <ここまでDLL内部> int main() {  Vect *vec = new Vect();  std::vector<clsTest *> clsList = vec->getClsList();  delete vec;  return 0; } DLL内部でnewしたクラスは、DLL内部でdeleteしなければならないとの事なので、 取得後はDLL内部(vecのデストラクタ内)でdeleteするようにしましたが、デバッグしてみると、 main()関数の return 0; が終わる瞬間に以下のエラー(警告)が出力されます。 --------------------------------------------- Debug Assertion Failed! ・・・ Expression: _CrtIsValidHeapPointer(pUserData) ・・・ --------------------------------------------- main()関数でのDLLから取得した clsList が残っていることが問題なように思えますが、 どなたか解決策が分かる方がいらっしゃいましたらご教授よろしくお願い致します。 開発環境はWindows2000でVC++6.0を使用しています。