classについて【C++】
C++におけるstructとclassの違い
- structとはC言語においてデータ構造を定義するための機能です。
- classはstructに関数が定義できるようになったもの。
- C言語では必要だったtypedefがC++では不要。
- structは、デフォルトのアクセシビリティがpublic
- classは、デフォルトのアクセシビリティがprivate
- アクセス指定はprivate、protected、publicの3種類。
- POD(Plain Old Data)型のデータ構造(C言語と互換性のあるデータ構造)を定義する時以外はクラスを使うのが推奨される?
テストコード
class person{ //アクセシビリティ(private) public://以下、public int id; int age; string name; // print information void print(){ cout << "id :" << id << endl; cout << "age :" << age << endl; cout << "name:" << name << endl; } }; int main(){ person kobayashi = {0, 14, "kobayashi"}; kobayashi.print(); }
実行結果
id :0 age :14 name:kobayashi
参考
連想配列とは【C++】
連想配列とは
- 「連想配列クラス」とは検索可能なキーと、キーに対応する値の組(ペア)を要素とするコンテナクラスで、 保持している要素から、キーを指定して値を高速に取り出せるクラス
- 例えば、string 型の人名と int 型の年齢を組にした要素を保持しておくと、名前をキーにして年齢を高速に取得することができる。 名前から年齢への写像(mapping)のようなものなので map というクラス名を持つ。
- 普通の配列は、0から連続した整数を添え字として配列の要素にアクセスすることができます。それに対して、連想配列というのは、整数以外(例えば文字列)の値を添え字として要素にアクセスすることができます。
- mapのイメージとして、最もわかりやすい例としてあげられるのが、辞書でしょう。辞書では、調べたい単語のページを調べると、その意味が得られます。この、調べたい単語にあたる部分を、キーと言い、意味にあたるものが、要素になります。
mapとunordered_mapの違い
- 実装方法の違い
- mapは平行二分探索木、unordered_mapはハッシュテーブルで実装されている。
- キーの順番を保持したい場合は、map
- キーの順番を保持しなくても良い場合は、unordered_mapの方が性能的には優れている。
- ハッシュ を使っているために、キーから要素を取り出す処理時間が O(1) とさらに高速である。
検証結果
map<string, int>mp = { {"Tanaka Taro", 1}, {"Nobi Nobita", 2}, {"Toireno Hanako", 3}, }; for(auto i=mp.begin(); i!=mp.end(); i++){ cout << "key = " << i->first; cout << ", val = " << i->second << endl; }
キー(名前)がソートされて、名前順(アルファベット順)に出力される
key = Nobi Nobita, val = 2 key = Tanaka Taro, val = 1 key = Toireno Hanako, val = 3
参考サイト
AtCoderで気をつけること①
データの範囲
- 例えば、この問題 -> ABC158 B - Count Balls
- 問題制約のデータNの範囲が1<N<1018となっている.
- int型配列でこのデータを扱うことはできない
- データ範囲: 約-21億から約21億であるため
- 1kilo(103), 1mega(106), 1giga(109) < int < 1tera(1012) < 1peta(1015) < 1exa(1018) < long long int < 1zetta(1021) < 1yotta(1024)
各データ型の範囲
型名 | サイズ | ビット幅 | 最小値 | 最大値 |
---|---|---|---|---|
int | 4 | 32 | -2147483648 | 2147483647 |
unsigned_int | 4 | 32 | 0 | 4294967295 |
long long int | 8 | 64 | -9223372036854775808 | 9223372036854775807 |
int64_t | 8 | 64 | -9223372036854775808 | 9223372036854775807 |
long long int とint_64t
- long longは64ビット以上の幅であることが保証されるが、64ビット固定の整数型が必要な場合には、int64_t型を使用することを推奨される
- long longのように、longを2つ連続させることで「longより大きな型」であることを表現するのは非常に醜いものではあるが、C99およびコンパイラの実装による事実上の標準があったために、C++もそれにならった。
- C言語およびC++言語ではint、long、long longのサイズは指定されておらず環境依存です。
検証プログラム
cout << "int: " << sizeof(int) << "bytes" << endl; cout << "___max: " << numeric_limits<int>::max() << endl; cout << "___min: " << numeric_limits<int>::min() << endl; cout << "unsigned int: " << sizeof(unsigned int) << "bytes" << endl; cout << "___max: " << numeric_limits<unsigned int>::max() << endl; cout << "___min: " << numeric_limits<unsigned int>::min() << endl; cout << "long : " << sizeof(long) << "bytes" << endl; cout << "___max: " << numeric_limits<long>::max() << endl; cout << "___min: " << numeric_limits<long>::min() << endl; cout << "long long: " << sizeof(long long int) << "bytes" << endl; cout << "___max: " << numeric_limits<long long int>::max() << endl; cout << "___min: " << numeric_limits<long long int>::min() << endl; cout << "int64_t: " << sizeof(int64_t) << "bytes" << endl; cout << "___max: " << numeric_limits<int64_t>::max() << endl; cout << "___min: " << numeric_limits<int64_t>::min() << endl;
int: 4bytes ___max: 2147483647 ___min: -2147483648 unsigned int: 4bytes ___max: 4294967295 ___min: 0 long : 8bytes ___max: 9223372036854775807 ___min: -9223372036854775808 long long: 8bytes ___max: 9223372036854775807 ___min: -9223372036854775808 int64_t: 8bytes ___max: 9223372036854775807 ___min: -9223372036854775808
参考サイト
vectorまとめ【C++】
vector型とは
- 可変長配列用の型(後から配列サイズを変更できる型)
vectorの宣言方法
#include<vector> using namespace std; //1次元配列 vector<型名> 変数名; vector<型名> 変数名(); vector<型名> 変数名(要素数); vector<型名> 変数名(要素数, 値);//値で初期化する vector<型名> 変数名 = {要素1, 要素2}
後から要素を追加/削除する方法
vector<int> vec{ 1, 2, 3}; // 1,2,3 vec.push_back(4); vec.emplace_back(5);// push_backと動作は同じだがより高速らしい // 1,2,3,4,5 vec.insert(vec.begin()+3,7); // 1,2,3,7,4,5 vec.pop_back(); // 1,2,3,7,4 vec.erase(vec.begin()+3); // 1,2,3,4
ソート
sort(v.begin(), v.end());//昇順 sort(v.begin(), v.end(), greater<int>()); // 降順