それぞれのよく使う処理の早見表
処理の内容 | C++ | C# |
---|---|---|
生成(要素なし) | vector<T> 変数名; | List<T> 変数名 = new List<T>(); |
生成 (要素数分を初期値で埋める) | vector<T> 変数名(要素数,初期値); | List<T> 変数名 = new List<T>(Enumerable .Repeat(初期値, 要素数)); |
追加 | .push_back(追加要素) | .Add(追加要素) |
要素数の取得 | .size() | .Count |
ソート | sort() | .Sort() |
リバース | reverse() | .Reverse() |
C++のsort(), reverse()はvectorのメソッドではないので注意…
C++の動的配列 → vector<T>
output_list()などは、この記事での説明のためのただの出力用の関数です。
一応コードを載せておきます
void output_list(vector<int> &vec) {
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << "\n\n";
}
void output_2Dlist(vector<vector<int> > &vec) {
for (int i = 0; i < vec.size(); i++) {
for (int j = 0; j < vec[i].size(); j++) {
cout << vec[i][j] << " ";
}
cout << endl;
}
cout << "\n\n";
}
生成・初期化・追加
//このサンプルでの仮の要素数
const int my_count = 5;
/*
生成•初期化•追加
*/
//要素なしのvectorを宣言
vector<int> vec_1;
//push_back()メソッドで追加できる
for (int i = 0; i < my_count; i++) {
vec_1.push_back(i);
}
output_list(vec_1);
//初期値(0)で要素を初期化
vector<int> vec_2(my_count, 0);
output_list(vec_2);
//多次元配列[row][column](2次元) を0で初期化
int row = 3; //行数
int column = 4; //列数
vector<vector<int> > vec_3(row, vector<int>(column, 0));
output_2Dlist(vec_3);
便利なメソッド・関数
/*
よく使うメソッドや関数
*/
vector<int> vec_4 = {3, 2, 8, 5};
//要素数
cout << (int)vec_4.size() << "\n\n";
//ソート
sort(vec_4.begin(), vec_4.end());
output_list(vec_4);
//リバース
reverse(vec_4.begin(), vec_4.end());
output_list(vec_4);
/*
ソート(比較方法定義)
今回は5で割ったあまりの大きさで昇順ソートしました
式の結果が
true : 左の要素が左に動く
false: 左の要素が右に動く
*/
sort(vec_4.begin(), vec_4.end(), [](const int left, const int right)->bool {
if (left % 5 < right % 5) return true;
else return false;
});
output_list(vec_4);
上に加えて覚えておくと便利なやつ
.assign(要素数, 値) メソッド
要素数個、値で埋めることができる。
これができると、グローバル変数として宣言したサイズ0のvectorをmain()内でassign()して欲しいサイズに変えてから使用できるので便利!!
.resize()も近い処理をしてくれますが、やや違いがあります。↓
vector<int> vec = {0, 1, 2};
//resizeは足りない分だけ補充される
vec.resize(5, 3);
output_list(vec);//0 1 2 3 3
//assignは個数分を全て埋める
vec.assign(5, 3);
output_list(vec);//3 3 3 3 3
C#の動的配列 → List<T>
これ以降のコードでもOutputList()が出てきますが、これらはいちいち出力するのが面倒なためまとめただけです。(Listとはなんら関係のないただの出力用ですが一応コードを載せておきます)
static void OutputList(ref List<int> tmp) {
foreach (var i in tmp) {
Console.Write(i + " ");
}
Console.WriteLine("\n");
}
static void Output2DList(ref List<List<int> > tmp) {
for (int i = 0; i < tmp.Count; i++) {
for (int j = 0; j < tmp[i].Count; j++) {
Console.Write(tmp[i][j] + " ");
}
Console.WriteLine();
}
Console.WriteLine();
}
生成・初期化・追加
//このサンプルでの仮の要素数
const int my_count = 5;
/*
生成•初期化•追加
*/
//要素なしのListを生成
List<int> list_1 = new List<int>();
//Add()メソッドで追加できる
for (int i = 0; i < my_count; i++) {
list_1.Add(i);
}
OutputList(ref list_1);
//初期値(0)で要素を初期化
List<int> list_2 = new List<int>(Enumerable.Repeat(0, my_count));
OutputList(ref list_2);
//多次元配列[row][column](2次元) を0で初期化
int row = 3; //行数
int column = 4; //列数
List<List<int> > list_3 = new List<List<int> >(Enumerable.Repeat(new List<int>(Enumerable.Repeat(0, column)), row));
Output2DList(ref list_3);
便利なメソッドやプロパティ
要素数はCountで取得
ソートはSort(),リバースはReverse()メソッドを使う
ソートの比較方法はSort()の引数に比較方法を与えることで行う
/*
よく使うメソッドやプロパティ
*/
List<int> list_4 = new List<int>{3, 2, 8, 5};
//要素数(Countプロパティ)
Console.WriteLine(list_4.Count + "\n");//4
//ソート
list_4.Sort();
OutputList(ref list_4);//2 3 5 8
//リバース
list_4.Reverse();
OutputList(ref list_4);//8 5 3 2
/*
ソート(比較方法定義)
今回は5で割ったあまりの大きさで昇順ソートしました
式の結果
負 :左側の値の方が小さい
等しい:同じ
正 :左側の値の方が大きい
*/
list_4.Sort((left, right) => left % 5 - right % 5);
OutputList(ref list_4);//5 2 8 3
最後に
今回は動的配列についてよく使う機能をまとめてみました♪
個人的にはC++とC#で宣言時の要素数と初期値の順番が逆なのが、ややこしかったです…
次回はqueue ・ priority_queue ・ stackについて記事にする予定です
では、良き競プロライフを!! サイゴマデヨンデクレテアリガトウッ>ヾ(≧▽≦*)o
コメント