基本中の基本その2『ListとVectorの違い』
その2では『ListとVectorの違い』についてです。
この二つは同じ様に使われていますが、
使用用途を間違えると無駄な処理が発生する事が有ります。
vectorは使ってるけどlistは使ってないって方もいらっしゃるのでは?
自分自身vector有ればよくね?とか考えてました。
しかし、仕組みを知ると愚かさに気づきます。
まずすごく簡単なListの使用例
#include <stdio.h>
#include <list>
#include<iostream>
int main()
{
std::list<int> list_val;
list_val.push_back(10);
list_val.push_back(20);
for each(int val in list_val)
std::cout << val << std::endl;
return 0;
}
出力:
10
20
本当にvectorとlistってかき方似てるなぁ…。
さて、有用な使い方のお話です。
単純にvectorとlistの違いはアクセス方法に有ります。
vectorは配列要素番号(インデックス)を保持して配列の中身の管理を行っています。
それに対し、listはアドレスのリンクによって配列の中身を管理します。
判りましたか?
つまり
vector
りんご_1 みかん_2 もも_3 ぶどう_4
インデックスが振られていきます。
list
りんご → みかん → もも → ぶどう
アドレスのリンクによって管理されます。
この二つは得意不得意が有ります。
例えば、削除や挿入を繰り返す時はどちらの構造がいいと思いますか?
正解はlistです。
その理由は以下の通り
りんご → みかん → もも → ぶどう
↑削除する
りんご → ↓ みかん → もも → ぶどう
→ → ↑
参照先のアドレスを変更するだけなので、速度が速い
しかし、このリストには弱点があり、ランダムアクセスを行った場合速度が
vectorより落ちる事が有ります。
理由はわかりますか?
インデックスで管理していないため、参照を行う場合
必ず最初のリストからみていかなければいけないのです。
ぶどうをアクセスしたくてもりんごから見ないといけないという事です。
ちなみに、配列要素を最初から連続でみていく場合、
例えば、シューティングとかの弾の当たり判定とか
その時は、速度は落ちません。
だいたい今の流れで分かったと思いますが、
vectorの場合はインデックスで管理しているので
参照を行う場合、1番目にアクセスしようが、100000番目にアクセスしようが
掛かる時間は一定です。
しかし、インデックスで管理している故に挿入削除は時間がかかってしまうのです。
りんご_1 みかん_2 もも_3 ぶどう_4
↑削除
りんご_1 もも_3 ぶどう_4
りんご_1 もも_2 ぶどう_3
インデックスの番号を全て書き換える為時間がかかっちゃう訳です。
その2しゅうりょうです。
お疲れ様でした。
この二つは同じ様に使われていますが、
使用用途を間違えると無駄な処理が発生する事が有ります。
vectorは使ってるけどlistは使ってないって方もいらっしゃるのでは?
自分自身vector有ればよくね?とか考えてました。
しかし、仕組みを知ると愚かさに気づきます。
まずすごく簡単なListの使用例
#include <stdio.h>
#include <list>
#include<iostream>
int main()
{
std::list<int> list_val;
list_val.push_back(10);
list_val.push_back(20);
for each(int val in list_val)
std::cout << val << std::endl;
return 0;
}
出力:
10
20
本当にvectorとlistってかき方似てるなぁ…。
さて、有用な使い方のお話です。
単純にvectorとlistの違いはアクセス方法に有ります。
vectorは配列要素番号(インデックス)を保持して配列の中身の管理を行っています。
それに対し、listはアドレスのリンクによって配列の中身を管理します。
判りましたか?
つまり
vector
りんご_1 みかん_2 もも_3 ぶどう_4
インデックスが振られていきます。
list
りんご → みかん → もも → ぶどう
アドレスのリンクによって管理されます。
この二つは得意不得意が有ります。
例えば、削除や挿入を繰り返す時はどちらの構造がいいと思いますか?
正解はlistです。
その理由は以下の通り
りんご → みかん → もも → ぶどう
↑削除する
りんご → ↓ みかん → もも → ぶどう
→ → ↑
参照先のアドレスを変更するだけなので、速度が速い
しかし、このリストには弱点があり、ランダムアクセスを行った場合速度が
vectorより落ちる事が有ります。
理由はわかりますか?
インデックスで管理していないため、参照を行う場合
必ず最初のリストからみていかなければいけないのです。
ぶどうをアクセスしたくてもりんごから見ないといけないという事です。
ちなみに、配列要素を最初から連続でみていく場合、
例えば、シューティングとかの弾の当たり判定とか
その時は、速度は落ちません。
だいたい今の流れで分かったと思いますが、
vectorの場合はインデックスで管理しているので
参照を行う場合、1番目にアクセスしようが、100000番目にアクセスしようが
掛かる時間は一定です。
しかし、インデックスで管理している故に挿入削除は時間がかかってしまうのです。
りんご_1 みかん_2 もも_3 ぶどう_4
↑削除
りんご_1 もも_3 ぶどう_4
りんご_1 もも_2 ぶどう_3
インデックスの番号を全て書き換える為時間がかかっちゃう訳です。
その2しゅうりょうです。
お疲れ様でした。
基本中の基本 その1『#defineとか』
覚書です。
#defineとかについてです。。
使い方としては
#include<stdio.h>
#include<iostream>
#define VALUE 100
int main()
{
std::cout << VALUE << std::endl;
return 0;
}
出力:
100
かなり一般的ですね。
というより、こんな使い方をするならstatic const int とか使えばいい気がしますけど…。
#include <stdio.h>
#include<iostream>
static const int VALUE = 100;
int main()
{
std::cout << VALUE << std::endl;
return 0;
}
出力:
100
しかし、defineに関してはこんな有用な使い方が有ります
#include<stdio.h>
#include<iostream>
#define DEBUG //●デバッグモードですよ
//↑本来は、スタートアップで設定しとくべき
//ファイルパス
#define PATH "D:\\PG\\"
//デバッグ時の出力ファイル名
#define DEBUG_FILENAME "Debug"
//リリース時の出力ファイル名
#define RELEASE_FILENAME "Release"
//拡張子
#define FILE_EXTENSION ".txt"
//デバッグの時
#ifdef DEBUG
#define OUTPUT_FILENAME PATH DEBUG_FILENAME FILE_EXTENSION
#endif
//リリースの時
#ifdef RELEASE
#define OUTPUT_FILENAME PATH RELEASE_FILENAME FILE_EXTENSION
#endif
int main()
{
std::cout << OUTPUT_FILENAME << std::endl;
return 0;
}
出力:
D:\PG\Debug.txt
#define DEBUG //●デバッグモードですよ
↓
#define RELEASE これに変更するだけで出力が
D:\PG\Release.txt になります。
文字列の操作を行う場合にはdefineが非常に便利です。
今回はファイルパスの指定をサンプルしましたけど、
他にも用途は有るのではないでしょうかね?
こんな感じでその1終了
#defineとかについてです。。
使い方としては
#include<stdio.h>
#include<iostream>
#define VALUE 100
int main()
{
std::cout << VALUE << std::endl;
return 0;
}
出力:
100
かなり一般的ですね。
というより、こんな使い方をするならstatic const int とか使えばいい気がしますけど…。
#include <stdio.h>
#include<iostream>
static const int VALUE = 100;
int main()
{
std::cout << VALUE << std::endl;
return 0;
}
出力:
100
しかし、defineに関してはこんな有用な使い方が有ります
#include<stdio.h>
#include<iostream>
#define DEBUG //●デバッグモードですよ
//↑本来は、スタートアップで設定しとくべき
//ファイルパス
#define PATH "D:\\PG\\"
//デバッグ時の出力ファイル名
#define DEBUG_FILENAME "Debug"
//リリース時の出力ファイル名
#define RELEASE_FILENAME "Release"
//拡張子
#define FILE_EXTENSION ".txt"
//デバッグの時
#ifdef DEBUG
#define OUTPUT_FILENAME PATH DEBUG_FILENAME FILE_EXTENSION
#endif
//リリースの時
#ifdef RELEASE
#define OUTPUT_FILENAME PATH RELEASE_FILENAME FILE_EXTENSION
#endif
int main()
{
std::cout << OUTPUT_FILENAME << std::endl;
return 0;
}
出力:
D:\PG\Debug.txt
#define DEBUG //●デバッグモードですよ
↓
#define RELEASE これに変更するだけで出力が
D:\PG\Release.txt になります。
文字列の操作を行う場合にはdefineが非常に便利です。
今回はファイルパスの指定をサンプルしましたけど、
他にも用途は有るのではないでしょうかね?
こんな感じでその1終了
お久しぶりです。
みなさんお久しぶりです。
学生生活が終わり、無事就職が出来た私。
某ゲーム開発会社で切磋琢磨働いております。
さて、入社してもうひと月以上経過するわけですが、
正直予想以上に仕事はキツイですね。
かつ給料安すぎてワラエナイ。
まぁ金の為だけだったらゲーム会社なんて行きませんよねー
熱意がないとダメだって理由が少しわかる気がします…。
さてさて、そんな私ですが、この度ゲーム開発のメインプログラマーになりました。
まさかの展開です。
技術も知識も普通よりないのに何故……?
などなど考えても仕方ないので、頑張りますよ♪
夏休みとかあるのかな……。
学生生活が終わり、無事就職が出来た私。
某ゲーム開発会社で切磋琢磨働いております。
さて、入社してもうひと月以上経過するわけですが、
正直予想以上に仕事はキツイですね。
かつ給料安すぎてワラエナイ。
まぁ金の為だけだったらゲーム会社なんて行きませんよねー
熱意がないとダメだって理由が少しわかる気がします…。
さてさて、そんな私ですが、この度ゲーム開発のメインプログラマーになりました。
まさかの展開です。
技術も知識も普通よりないのに何故……?
などなど考えても仕方ないので、頑張りますよ♪
夏休みとかあるのかな……。
C#勉強開始
仕事で必要になったので勉強開始しました。
とりあえず、色んなサンプル打ちながら基本を押さえて行こうと思っています。
ほいで現在、音楽プレイヤーでも作ってみようと言う事で、
ダイアログを使ってwavファイルを引っ張ってきて、音楽を再生、停止まで
する事が出来ました。
んで、次にwavをダイアログを使って複製でもしてみようと思っているんですが、
SaveFileDialogを使ってどうやってファイルを書きだして良いのかがわからん!
一応指定したファイル名でファイルは出来るんですが、なんも情報が入っていない!!
んーわからんなぁ、System.IOを使って情報をいれるのかなぁ。。。
サンプルだとテキストの書きだしとか、自分で入力したstringを書きだすとかだと見つかった
のですが、セカンダリバッファの内容を書きだすにはどうすればいいのか・・・
そもそもDirectSoundの中身(Buffer??)もよくわかんなし。。。
もっと勉強しないと・・・。
就職報告
とうとうゲーム会社に就職出来る事になりました。
中途しか雇ってくれない会社に新卒として行くのですが、不安でいっぱいです。
まあね、会社は俺が勉強出来てないの承知で雇ってくれるみたいなんだよね。
こりゃ、頑張らないと申し訳ないよね。
就職って、内定までが大変だと思っていたけど、内定とった後のが怖いね
自信なんてまるでないし、必要とされていると思うと・・・。
まぁ怖がっていても仕方がないよね。頑張るよ。