基本 その3『文字配列→数値』
今回紹介するのは
char* の文字配列から
int 数値への変換です。
#include
#include
int main()
{
using namespace std;
char* inBuf = "39";
int size = 0;
int check = strtoul(inBuf, NULL, 10);
if(check == 0x27)
{
cout << "成功" << endl << check << endl;
}
else
{
cout << "失敗" << endl <
出力:
成功
39
strtoulというものを使えば文字配列を簡単に数値に
変える事が出来ます。
戻り値 = strtoul(引数1, 引数2, 引数3)
引数1:変更したい文字配列
引数2:NULLでOK
引数3:基数
戻り値:変更後の数値
さて、引数3に注目してほしいのですが、この命令には基数を決める事が
出来るのです。
つまり2進数や16進数へ変換も可能となります。
今回のサンプルでは10進数の変換にしているので引数3は10にしました。
こんな感じでおっわりー
基本 その2『ListとVectorの違い』
その2では『ListとVectorの違い』についてです。
この二つは同じ様に使われていますが、
使用用途を間違えると無駄な処理が発生する事が有ります。
vectorは使ってるけどlistは使ってないって方もいらっしゃるのでは?
自分自身vector有ればよくね?とか考えてました。
しかし、仕組みを知ると愚かさに気づきます。
まずすごく簡単なListの使用例
#include
#include
#include
int main()
{
std::list
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
#include
#define VALUE 100
int main()
{
std::cout << VALUE << std::endl;
return 0;
}
出力:
100
かなり一般的ですね。
というより、こんな使い方をするならstatic const int とか使えばいい気がしますけど…。
#include
#include
static const int VALUE = 100;
int main()
{
std::cout << VALUE << std::endl;
return 0;
}
出力:
100
しかし、defineに関してはこんな有用な使い方が有ります
#include
#include
#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終了