C++

C++のbitsetに関するメモ

競技プログラミングで使いたいと思いつつずっと未履修だったbitsetの使い方を勉強しました。 基本操作 以下ではすべて以下が書かれているものとします。 #include <bitset> #include <iostream> using namespace std; 初期化は、文字列を与えるか、整数を与えるかで行えます。 </iostream></bitset>…

std::setやstd::multisetで末尾の要素を削除する

C++

std::setやstd::multisetで末尾の要素を削除するには、https://www.geeksforgeeks.org/how-to-delete-last-element-from-a-set-in-c/ で紹介されているテクニックを使います。例えばsをstd::setのオブジェクトとした場合、std::prev(s.end()) が末尾の要素を…

std::vectorのresizeとassignの違い (C++)

C++

恥ずかしながらC++のvectorのassign(n, val)という関数を知らなかったのでメモです。 よく似た関数に、resize(n, val)という関数があります。以下のコードで挙動を比較してみます。 #include <iostream> #include <vector> void print_vector(const std::vector<int> &vec) { for (a</int></vector></iostream>…

ios_base::sync_with_stdio(false); cin.tie(0); の意味

競技プログラミングでC++を使うときに、入出力を高速化する目的でおまじないのように書かれる ios_base::sync_with_stdio(false); cin.tie(0); の意味、実はよくわかっていなかったので c++ - Significance of ios_base::sync_with_stdio(false); cin.tie(NU…

C++のmultisetの使い方

競技プログラミングでC++のmultisetをたまに使うことがありますが、毎回使い方を忘れているのでメモしておきます。 (2021-09-05追記: 計算量に誤りがあったので修正) multisetとは multisetは、集合を扱うデータ構造です。setと異なり、同じ値の要素を複数持…

CUDAを使って2枚の画像の平均をとるプログラム

CUDAの勉強がてら書いてみました。2枚の同サイズの画像を読み込んで、平均画像を作成して保存するだけのプログラムです。環境はUbuntu 16.04です。 // 2枚の画像の平均を取るプログラム // 画像は以下から6000x4000のものを取得 // https://www.pexels.com/p…

TopCoderのプラグインGreedで自動生成したコードで「あいまいなシンボルです」エラーを回避

TopCoderのプラグインGreed(詳細はTopCoder の強欲プラグイン、Greed を使う!)で自動生成したコードをVisual Studioでビルドすると以下のようなエラーが出ます。 error C2872: 'data': あいまいなシンボルです。 note: 'std::ifstream data' である可能性…

Travis CIでC++11, C++14のコードをビルド

C++

昔Travis CIでC++11のコードをビルドしたとき(参考:Travis CI にて、C++11のソースをgccとclangの両方でビルドする - minus9d's diary)やたら大変だったのですが、いつのまにかUbuntuのバージョンが14.04に上がったらしく、前よりは簡単にできるようにな…

Visual C++にて、CPUにAVX命令があるかどうかを実行中に知る方法

C++

表題のことは、__cpuid, __cpuidexにあるサンプルコードで実現できます。Visual Studio 2017で確認しました。 自分の初代Core i7では、下記のようにAVXに対応していないことがわかります。 GenuineIntel Intel(R) Core(TM) i7 CPU 870 @ 2.93GHz 3DNOW not s…

g++によるhello world再訪

C++

g++でhello.cppから実行ファイルを生成するときに何が起こっているかを調べてまとめました。全体的に gcc Compilation Process and Steps of C Program in Linux を参考にしています。元記事はCファイルを対象にしていますが、本記事ではC++ファイルを対象と…

multiset, multimapを使うにはset, mapをinclude

C++

しょうもないネタですが他にもハマる人がいるかもしれないので記事にします。C++11から導入されたstd::multiset, std::multimapを使おうと以下のコードを書きました。 #include <multiset> #include <multimap> しかしg++で以下のエラーが出ます。 致命的エラー: multimap: No su</multimap></multiset>…

Travis CI にて、C++11のソースをgccとclangの両方でビルドする

githubのレポジトリと簡単に連携できる継続的インテグレーションサービスであるTravis CIを使って、C++11で書かれたソースコードをテストできるようにしました。想像以上に大変だったのでメモしておきます。 ソースコードとテストコードの準備 Travis CIで提…

cmathをincludeするとy0, y1などのグローバル変数が使えなくなる問題

C++

一見問題なさそうな以下のコード #include <cmath> int x1, y1; int main() { x1 = 10; y1 = 5; return 0; } を、例えばVisual C++ 2015でコンパイルしようとすると、以下のエラーが出て失敗します。 main.cpp(3): error C2365: 'y1': redefinition; previous defin</cmath>…

Modern C++でのクラスに関する私的メモ

C++

C++のクラスについて理解があやふやなので、調べたことを以下にまとめます。C++11以降をターゲットにしています。 特殊メンバ関数 (Special member functions) 以下に、メンバ変数を2つとメンバ関数を1つのみ持つ単純なクラスを含むサンプルを示します。 #in…

gdbでvectorなどの中身をprintする

C++

gdbでvectorなどSTLのコンテナの中身をprintしようとすると、例えば以下のようにうまく表示できません。 (gdb) p x1 $1 = {<std::_Vector_base<int, std::allocator<int> >> = { _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x8003b9e8, _M_finish = 0x8003b9fc, _M_end_of_storage …</no></no></__gnu_cxx::new_allocator<int></std::allocator<int></std::_vector_base<int,>

C++11で、std::tie()を使って複数の変数への代入を1行で行う

C++

スクリプト言語だと、複数の変数への代入を1行で行えることが多いです。以下はPythonの例。 a,b,c = 10, 7.7, "hello" print(a,b,c) これと同じことをC++11でも行うには、std::tie()を使います。 #include <iostream> #include <tuple> using namespace std; int main(){ int </tuple></iostream>…

lower_bound(), upper_bound()の練習帳

C++

事前準備 数列は昇順にソートされている必要があります。 #include <iostream> #include <algorithm> int main() { std::vector<int> nums{1,1,1,1,2,2,3,3,3,4,4,6,6,6}; std::sort(nums.begin(), nums.end()); .... } 要素の数を数える 「3より小さい要素数」「3以下の要素数」を数え</int></algorithm></iostream>…

C++11のラムダ関数の簡単なまとめ

C++

C++11で導入されたラムダ関数を使えるようになるための簡単な覚書です。 ラムダ関数とは? 名前のない関数のことです。無名関数と呼ばれることもあります。 わざわざ関数を定義するほどのこともない、ちょっとした処理を行いたいときに使われることが多いで…

C++で1文字の繰り返しからなる文字列を作る

C++

C++で"aaaaa"などのように単一文字の繰り返しからなる文字列を簡単に作るには、以下のようにstringクラスのコンストラクタを利用します。 #include <string> ... std::string(5, 'a') ... これは、「長さ5の文字列を作り、'a'で埋める」という意味になります。 例と</string>…

Visual Studioのコードスニペット機能を使って高速にコードを書く

常識かもしれないのですが、Visual Studioのコードスニペット機能にいまさら気が付きました。 例えばC++の場合、classと打鍵してからTabを押すと、自動的に以下のコードスニペットが挿入されます。 class MyClass { public: MyClass(); ~MyClass(); private:…

Visual Studioで、namespaceのブロック内をインデントしないようにする方法

従来のVisual Studioでは、namespaceで囲ったブロック内が強制的にインデントされました。しかし、Visual Studio 2013のUpdate 2から(?)、インデントしないように設定できるようになったようです。(参考:Option to stop indenting namespaces in C++ code …

C++のvalarrayという不遇なライブラリ

C++

きっかけが何だったか忘れましたが、C++にはvalarrayという数値計算用のライブラリがあることを知りました。numpyやMatlab/Octaveのように、array同士の足し算ができたりします。 #include <iostream> #include <valarray> using namespace std; int main(){ valarray<int> v1(10, 3);</int></valarray></iostream>…

SIMD命令を使って高速に計算する

C++

マルチコアを用いた画像処理 from Fukushima Norishige このスライドに出てくるSIMD命令を試したくなったので試してみました。 IntelのCPUでSIMD命令を使う場合、SSEという命令セットと、その後継であるAVXという命令セットのどちらかを使うことになると思い…

C/C++11で直角三角形の斜辺の長さを求める関数hypot()

C++

ピタゴラスの定理を使うと、直角三角形の直角を挟む二辺の長さから、斜辺の長さを計算できるのはおなじみでしょう。それを計算してくれる関数がmath.hまたはcmathで提供されているhypot()です。 以下はC++11の例です。 #include <iostream> #include <cmath> using namespace </cmath></iostream>…

C++11で数字→文字列はstd::to_string()、文字列→数字はstd::stoi()とかstd::stod()とか

C++

数字から文字列 スクリプト言語でよくある、数字を文字列に変換する関数がC++11でも提供されています。std::to_string(100)などと書くだけで数字が文字列に変換できます。 #include <iostream> #include <string> int main() { std::string str = "Holland, " + std::to_string</string></iostream>…

g++のレアなエラー「前のエラーにより混乱していますので、脱出します」

C++

人間味あふれるエラーに初遭遇したのでご報告します。現時点でGoogle検索すると792件。 エラーを起こす方法。Windows 7 + Cygwin + g++ 4.8.2にて、g++ -std-std=c++11というコマンドで以下のコードを実行。何重にもミスがあるひどいコードである。 #include <vector></vector>…

Visual StudioでDLLを作る&使うサンプル

DLLの作り方と、DLLを呼び出すプログラムのサンプルをgithubに上げました。Visual Studio 2013 Expressがあればビルドできます。 minus9d/DllSample 以下の書籍を全面的に参考にしました。 APIで学ぶWindows徹底理解 (日経BPパソコンベストムック) p102~p109…

Linuxのターミナルにて、アニメーションを表示する

C++

昨日の記事と似たような感じで、エスケープシーケンスを使ってアニメーションを表示することもできる。今回もLinux系のターミナルでないとうまくいかないはず。 アニメーションには、printf("\033%dA", 10)とするとカーソルが10行分上に上がることを利用する…

Linuxのターミナルにて、C言語の出力に色を付ける

Linuxのターミナルにて、C言語の出力に色を付ける方法。c - Making some text in printf appear in green and red - Stack Overflowより。Windowsだとうまくいかないはず。 #define RESET "\033[0m" #define BLACK "\033[30m" /* Black */ #define RED "\033…

Segmentation Faultの傾向と対策

C++

C/C++のコードを書いてよく遭遇するのがSegmentation Fault、通称セグフォ。その傾向と対策をまとめてみた。 傾向 セグフォがよく起こるのは以下のとき。 メモリ違反 見てはいけないメモリ領域を参照したときに起こる。コード例は以下。 #include <stdio.h> int main(</stdio.h>…