「C++/標準テンプレートライブラリ」の版間の差分
削除された内容 追加された内容
Semi-Brace (トーク | 投稿記録) M added Category:C++ using HotCat |
Semi-Brace (トーク | 投稿記録) M 内容の調整 |
||
1 行
== はじめに ==
STLは作業の重複を省く意味でも積極的に用いるのがよいでしょう。ただし、これらのデータ構造を用いることだけが目的なら、[[Perl]]、[[Python]]などを試してみることを勧めます。これらの言語はC++ほど速く実行されはしません。しかし、C++と比べて比較的簡潔にこれらを用いることが出来ます。そのため、STLはC++を用いる上でこれらのデータ構造が必要になった時に使われます。
==
Cではchar型の
以下の例を見てください。
例1: C形式の
<syntaxhighlight lang="c">
#include <stdio.h>
#include <string.h>
16 ⟶ 14行目:
int main()
{
const char * s1
char s2[256];
27 ⟶ 25行目:
return 0;
}
</syntaxhighlight>
C++では、C形式の文字列の代わりに{{code|std::string}} (以下、単に{{code|string}}) 型を用いて文字列操作を行うことができます。
{{code|string}}型を使って上記のコードと同じ働きをするコードを書くと、次のようになります。
例2: 例1と同じ動作をするコード
<syntaxhighlight lang="c++">
#include <iostream>
#include <string>
49 ⟶ 48行目:
return 0;
}
</syntaxhighlight>
{{code|string}}型には
ところで、例1を関数に分割すると、次のようになります。
<syntaxhighlight lang="c">
#include <stdio.h>
#include <string.h>
void func(const char* s1)
{
char s2[256]; //<--s1の文字列サイズチェックがないとs2にコピー時オーバーフロー発生する可能性ある
strcpy(s2, s1); /* 文字列のコピー */
printf("%s\n", s2);
strcat(s2, s1); /* 文字列の追加 */
printf("%s\n", s2);
printf("%zu\n", std::strlen(s2)); /* 文字列のサイズ */
}
int main()
{
char s1[] = "mojiretu";
func(s1);
return 0;
}
</syntaxhighlight>
例3では{{code|func()}}は{{code|main()}}からしか呼ばれません。
しかし、{{code|func()}}に渡された文字列の長さをチェックしないと、s2に対して範囲外へのアクセスを行う可能性があるため危険です<ref group="注">257文字以上の文字列を{{code|func()}}に渡すとバグの原因になります</ref>。
これに対してC++バージョンを関数分割すると、
次のようになります。
例4: 例2を関数に分割したバージョン
<syntaxhighlight lang="cpp">
#include <string>
void func(const std::string& s1)
{
std::string s2;
s2 = s1; /* 文字列のコピー */
std::cout << s2 << std::endl;
s2 += s1; /* 文字列の追加 */
std::cout << s2 << std::endl;
std::cout << s2.size() << std::endl; /* 文字列のサイズ */ </syntaxhighlight>
{{code|string}}型は必要に応じて内部のバッファが拡張されるので、引数で渡された文字列のサイズを気にせずコピーや追加を行うことが出来ます。
== 注釈 ==
{{reflist|group=注}}
[[カテゴリ:C++]]
|