C++erと学ぶ、C#の動的配列 List<T>

C#

それぞれのよく使う処理の早見表

処理の内容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

コメント

タイトルとURLをコピーしました