パーソナルツール
現在位置: ホーム Addie's Diary C++チャレンジ

C++チャレンジ

作者: (A|E)ddie at 2010年09月23日 23時35分 |
Filed under:

やっぱりC++やりたいよねーってことで、
もう一回C++を初めから勉強することに。

とりあえず、数字で構成された文字列(string)を
数値(int)のvectorに変換するコードを書いてみた。

 

vector<int> stringToIntVector(string str)
{
vector<int> result(str.size());
for (int i = 0; i < str.size(); i++)
{
if ('0' <= str[i] && str[i] <= '9')
{
result[i] = (int) (str[i] - '0');
}else{
result.clear();
break;
}
}
return result;
}

なんかエラー処理がいまいちな気がするけど…

突っ込みあったら是非コメントを。

 

2010/09/28 追記

Hatさんにコメント頂いたので、コードをちょっと修正

std::vector<int> stringToIntVector(std::string str)
{
std::vector<int> result(str.size());
for (int i = 0; i < str.size(); i++)
{
if ('0' <= str[i] && str[i] <= '9')
{
result[i] = str[i] - '0';
}else{
result.clear();
break;
}
}
return result;
}

修正箇所は以下の2点

  1. 名前空間を明示的に指定するようにした。(テストコードでついusing namespace stdしちゃってた)
  2. intキャストは冷静に考えると効果が無いので削除…していいんだと思うんだけど、自信はない。
ドキュメントアクション

コメント (2)

Hat 2010年09月26日 13時31分
こちらも最近C++コードは書いてないけど、テキトーな突っ込みを。

ちょっとライブラリっぽいコードなので、stdの名前空間は取り込まない方がいいかなぁ、とか
Cのキャストはどうかなぁ、とか
(この場合ってreinterpret_castかな?)

研究所にいると効率より面白さ重視なので、こういうコードでも無駄に再帰降下パーサで実装したりしがちです。
(A|E)ddie 2010年09月28日 23時22分
コメントありがとー。助かります。
std名前空間についてはコードスニペットとしてもちょっとアレですな。
キャストについては、ハーバート本(標準講座C++)によると伝統的キャストってことで何気なくメインで紹介されてるので良いのかなぁと思ってるんだけど、それより何よりこのコードでは明示的にキャストする利点があまりないような気がしたので外してみた。

言われて気づいたけど、確かにパーサだからそう考えると再帰ってのもアリなのかも。
でも、そんなに複雑じゃないからループで良いんだい(笑)
« 2018 年 12月 »
12月
1
2345678
9101112131415
16171819202122
23242526272829
3031