タグ

STLに関するbabydaemonsのブックマーク (41)

  • deque

    deque とは dequeとはDouble Ended Queue、つまり両端キューのことです。 ちなみに、queue(待ち行列、キュー)に格納された要素の取り出しのことをdequeue(デキュー)といいます。 非常に紛らわしいネーミングですが、別物です。気をつけましょう。 話を元に戻して、両端キューというものが何かというと、 先頭に要素を挿入する 先頭の要素を削除する 末尾に要素を挿入する 末尾の要素を削除する という4つの操作が許されるデータ構造のことで、dequeはこれらの操作を O(1) で行うことができます。 dequeは内部的にはリングバッファというデータ構造になっています。 リングバッファとは配列の先頭と末尾をつないで環状にしたものだと思ってください。 リングバッファの実装には配列を用います。 普通、配列の末尾(rear)に要素を加えるとき、 int array[SIZE]

    deque
  • 【修正あり】基本統計量をC++で計算してみる - Qiita

    \begin{align} x_M&=\max_{i=1,...,N} {x_i}\\\ x_m&=\min_{i=1,...,N} {x_i} \end{align} #include <algorithm> // max_elementは最大値のイテレータを取得する // ゆえに*演算子で最大値の値に変換している const auto max = *std::max_element(std::begin(data), std::end(data)); // 最小値を取得する const auto min = *std::min_element(std::begin(data), std::end(data)); // 結果を表示する std::cout << "最大値:" << max << std::endl; std::cout << "最小値:" << min << std::e

    【修正あり】基本統計量をC++で計算してみる - Qiita
  • std::accumulateでvectorの合計や平均値を出す(std::accumulateの第3引数について考察もあり)

    自分のメモのために書いていくので,誰かのためになったら幸せです. 主にlinux, プログラム,電子回路について書いていきます. また、ここに載せる内容を参考にする場合は自己責任でお願いします。 配列やVectorなどの合計や平均値を求めたい場合に"std::accumulate"という関数を使うと比較的簡単に求められます. これから,基的な使い方と,自分がはまったところを説明します. まず,簡単な使い方は下のコードを見てください. #include <iostream> #include <vector> #include <numeric> int main(void) { std::vector vec; for( int i = 0; i <= 10; i++){ vec.push_back( i ); } std::cout << "sum = " << std::accumu

  • その12 イテレート中のSTLのlistから要素を安全に削除する方法

    ホーム < ゲームつくろー! < Programming TIPs編 その12 イテレート中のSTLのlistから要素を安全に削除する方法 STLのコンテナは「イテレータ」によって要素を取り出します。この時良くあるのが「ある要素をチェックして、必要が無くなった場合はリストから削除する」という作業です。例えば描画オブジェクトのリストからもういらなくなったオブジェクトを除く時などこの作業が必要になります。 イテレート中のリストから要素を除く場合、ちょっと注意しないと思わぬバグが誘発します。この章ではイテレート中のリストから要素を除く方法をまとめます。まさにTIPsです(^-^;。 ① まともにやるとあっさりバグ 例として、int型のリストに0~9までの要素がこの順番で登録されているとしましょう。このリストをイテレートして「5」を取り除きたいとして、次のようなコードを書きました:

    babydaemons
    babydaemons 2019/01/23
    “イテレーション増加をループ内で操作すると良し!”
  • C++ 文字列クラス std::string 入門

    C++ 文字列クラス std::string とは std::string とは C++ で標準に使用できる便利な文字列クラスでござるぞ。 C/C++ ではダブルクォートで文字列リテラルを表し、通常配列に文字を格納し加工することもできる。 strlen() など文字列の状態を返したり、sprintf() などの文字列を作成する関数などが用意されている。 しかし、リテラル文字列は動的な操作に不向きで、柔軟性に欠ける。 そのため、C++では動的にサイズを変更可能な文字列クラス std::string が導入された。 通常文字列と同じように [] 演算子で文字を参照・代入することはもちろん、サイズ情報等の取得や文字の挿入削除なども可能だ。 std::string は std::vector とよく似ている。size(), push_back() など、用意されているメンバ関数もほぼ同じで、 文字

    C++ 文字列クラス std::string 入門
  • std::vectorの正しい使い方 - ぷろみん

    イテレータ無効化ルール イテレータは容易に無効化されます。 Iterator Invalidation Rules (C++0x) 例えばvectorはコンテナサイズよりも要素が増えた場合、要素が取り除かれた場合にイテレータは無効化されます。 なので、基的にイテレータが無効化される操作とされない操作を明確に分離して考える事で危険を減らすと良いと思います。 const性とイテレータ無効化ルール const vectorは一切の変更を認めませんが、イテレータ無効化ルールは要素の増減が無ければ変更を許します。 const vectorは変更をコンパイルエラーにしてくれますが、イテレータ無効化ルールは要素の増減に対してエラーを出してくれません。 そこで、イテレータ無効化を避ける方法としてSTLのalgorithmを使います。 algorithmは明示的に破壊しなければイテレーション中にイテレータ

    std::vectorの正しい使い方 - ぷろみん
  • C++の文字列操作 その3 - minus9d's diary

    以下、すべて #include <iostream> using namespace std; と書いてあるものとする。 文字列の置換 replace()を使う。取りうる引数はいろいろあるけど、多分一番使うのは以下の例。 string str = "Today is April 19."; str.replace(9, 5, "May"); // strのindex9から5文字分を"May"に置換 cout << str << endl; // "Today is May 19." 特定の文字列を繰り返し置換 例えば"aa bb cc aa bb cc"という文字列が与えられた時、"bb"の部分をすべて"bbbbb"と置換したいとする。以下のコードでいいのかな? string str = "aa bb cc aa bb cc"; string from = "bb"; string to

    C++の文字列操作 その3 - minus9d's diary
    babydaemons
    babydaemons 2016/09/23
    replace()はfind()を併用して、グローバルな文字列置換を実現する感じ
  • C++ 文字列中から文字列を検索して別の文字列に置換する - 【はてな】ガットポンポコ

    /** * 文字列中から文字列を検索して別の文字列に置換する * @param str : 置換対象の文字列。上書かれます。 * @param from : 検索文字列 * @param to : 置換後の文字列 */ void strReplace (std::string& str, const std::string& from, const std::string& to) { std::string::size_type pos = 0; while(pos = str.find(from, pos), pos != std::string::npos) { str.replace(pos, from.length(), to); pos += to.length(); } }解説 1.str.find(from, pos) ⇒ str の pos 位置から from を探す、p

    C++ 文字列中から文字列を検索して別の文字列に置換する - 【はてな】ガットポンポコ
  • 各種stlコンテナでのループ中の要素の削除 - Qiita

    vector<int> v; v.push_back(10); v.push_back(20); v.push_back(30); vector<int>::iterator it = v.begin(); while (it != v.end()) { if (*it == 20) { it = v.erase(it); } else ++it; } it = v.begin(); while (it != v.end()) { cout << *it << endl; ++it; } deque<int> v; v.push_back(10); v.push_back(20); v.push_back(30); deque<int>::iterator it = v.begin(); while (it != v.end()) { if (*it == 20) { it = v.era

    各種stlコンテナでのループ中の要素の削除 - Qiita
    babydaemons
    babydaemons 2015/06/15
    めちゃくちゃ助かりました!!!
  • スレッドセーフという幻想と現実 - yohhoyの日記(別館)

    この記事はC++ Advent Calendar 2013の15日目にエントリしています。 内容はC++標準ライブラリとスレッドセーフに関する解説になります。 flickr / rennasverden もくじ What's スレッドセーフ? スレッドセーフという幻想 基型とデータ競合 C++標準ライブラリとデータ競合 C++標準ライブラリ:シーケンスコンテナ編 C++標準ライブラリ:連想コンテナ編 スレッドセーフ RELOADED 基的なスレッドセーフ保証 std::shared_ptr<T> std::rand() std::cout (文のみ約9000字) はじめに マルチスレッド対応の点では他言語に遅れを取っていたプログラミング言語C++ですが、C++11ではようやく標準ライブラリにスレッドサポートが追加されました。C++11スレッドサポートではスレッドクラスstd::thr

    スレッドセーフという幻想と現実 - yohhoyの日記(別館)
    babydaemons
    babydaemons 2015/02/09
    “利用者視点の表現では、上記ルール“全てconstメンバ関数相当呼び出しならば排他制御は不要である”というのが、C++標準ライブラリが提供するスレッドセーフ保証と解釈できます”
  • STLのstringとAllocatorについて

    現在のプロジェクトにおいて、メモリの確保は指定されたプライベートヒープ領域内()で確保・解放するよう指示をされています。 STLのstringを使う際に独自のアロケータを作成し、allocate()、deallocate()の中でメモリの確保・解放をしようとしており、下記のように型定義したのをstringとして使用していこうとしています。 --- typedef basic_string<char, char_traits<char>, CustomAllocator/*独自で作成したアロケータ*/<char>> String; --- 独自のアロケータは、下記のページを参考につくり、allocate()の中で、HeapAlloc()を呼び、deallocator()の中でHeapFree()を呼びます。 http://www.doumo.jp/aon-java/jsp/postgreti

    babydaemons
    babydaemons 2014/07/03
    思わぬ落とし穴。orz “STLのstringは、サイズが小さいときは、高速化のために、新たにメモリを確保しないのが、普通の実装ですね”
  • STLのコンテナで自作のallocatorを使う - 雷鳴の日記

    特に理由もなく、突然自作allocatorをSTLコンテナ、文字列で試したいです。 STLで、デフォルトのstd::allocatorがある。vectorを使う時、allocatorを指定しなかったらそれを使う。 VC2010のSTLのvectorヘーダに、こういうコードがある template<class _Ty, class _Ax = allocator<_Ty> > class vectorそしてこんな構造体があるexplicit vector(const _Alloc& _Al)じゃ、自分のallocatorを指定すると、自分でメモリ管理できる。 よくみると、xmemoryにstd::allocatorはこんなもんなんだ #define _ALLOCATOR allocator #define _PDFT ptrdiff_t template<class _Ty> class _

    STLのコンテナで自作のallocatorを使う - 雷鳴の日記
    babydaemons
    babydaemons 2014/07/03
    なんだか、Visual C++ランタイムのmalloc()とfree()を信用してはいけない気がして、ググったら見つかったエントリ
  • std::vectorの効率的な回し方 - joynote break;

    std::vectorの効率的な回し方 #include <iostream> #include <vector> using namespace std; int main(){ vector<int> v; v.push_back(10); v.push_back(20); // vectorの範囲チェックを一回で終わらせておく // そして、生成破棄の早い自動変数かつ、初期化時に代入で無駄を省く size_t size = v.size(); // 範囲チェックを行わない[]でアクセスする // size_tを使っているのは、 // std::vectorのsizeメソッドの返り値がsize_t(unsigned int)だから for(size_t i=0; i < size; i++) { cout << v[i] << endl; } return 0; } 数が大きくなってく

    std::vectorの効率的な回し方 - joynote break;
  • Google Sites: Sign-in

  • [cpp] std::vectorを配列の引数に渡す - はわわーっ

    配列を引数にとる関数にstd::vectorを渡すときは &v[0] &v.front() のどちらかを使えばよい。サンプルコード #include <iostream> #include <vector> void Show(const int* array, int size) { for(int i = 0; i < size; ++i) { std::cout << array[i] << ' '; } std::cout << std::endl; } int main() { std::vector<int> v(10); for(size_t i = 0, size = v.size(); i < size; ++i) { v[i] = i * i; } Show(&v.front(), v.size()); } 追記 5/24 id:bolerosさん、id:rhysdさん

    [cpp] std::vectorを配列の引数に渡す - はわわーっ
    babydaemons
    babydaemons 2013/10/30
    "C++03以降では v.data() を使って Show(v.data(), v.size()); とすればいいようです。"
  • std vector C++ -- deep or shallow copy

  • Multithread programming with STL

    C++でプログラミングするとき、STLを使うと楽ですが、 マルチスレッドプログラミングの時には、 #define _PTHREADS (とか#define _SOLTHREADS) とかをしないといけません。 stl_config.hに定義されてます。 これを忘れるとアロケートがMT-Safeでないために困惑させられます。 誰か書いといてください… ちなみに、x86_Solaris + pthreadでlistを使うと、 push, popが3倍くらい遅くなりました。使えないじゃん。 トップページへ戻る yokoyama@logos.t.u-tokyo.ac.jp

    babydaemons
    babydaemons 2013/10/22
    "C++でプログラミングするとき、STLを使うと楽ですが、 マルチスレッドプログラミングの時には、#define _PTHREADS (とか#define _SOLTHREADS)とかをしないといけません"
  • mapの初期化

    お茶を濁せばこんな感じ。 #include <map> #include <string> #include <utility> #include <iostream> using namespace std; int main() { typedef pair<string,int> item; pair<string,int> table[] = { item("October", 10), item("November", 11), item("December", 12) }; map<string,int> m(table, table+3); for ( map<string,int>::const_iterator it = m.begin(); it != m.end(); ++it ) { cout << it->first << ':' << it->second <<

    mapの初期化
    babydaemons
    babydaemons 2013/10/09
    std::mapの静的っぽい初期化は、std::pairの静的配列をコンストラクタで渡せと。static constなクラス変数を初期化したいから、これでも目的は果たせるw
  • http://www.interq.or.jp/jazz/iijima/stl/contents/find_exam01.html

    STLアルゴリズム練習帳 by iijima ■要素の検索(1) find, find_if / bind1st, bind2nd find関数,find_if関数のプロトタイプ: InputIterator find( InputIterator beg, InputIterator end, const T& value ); InputIterator find_if( InputIterator beg, InputIterator end, UnaryFunc op ); find関数は,コレクションの[beg, end)の範囲から,第3引数valueに「等しい」最初の要素を指す反復子を返す. 「等しい」とは,'==演算子'がtrueを返す(または'!=演算子'が false を返す)場合の左右辺の関係のこと. コレクションの要素の型Tがクラスの場合,Tオブジェクトに適用できる'

    babydaemons
    babydaemons 2013/10/03
    "std::distance( seq.begin(), it )"の存在を知りませんでした。orz
  • vector同士の連結は?

    babydaemons
    babydaemons 2013/09/25
    “dst.insert(dst.end(), src.begin(), src.end());”