ほとんどが事前に構築されたソリューションの場合、ベクトルとを使用しstd::transform
ます。アイデアは、各文字を調べて、その整数形式をベクトルに追加することです:(完全なサンプルを参照)
std::string s = "1357924680";
std::vector<int> ints;
ints.reserve(s.size()); //to save on memory reallocations, thanks Nawaz
std::transform(std::begin(s), std::end(s), std::back_inserter(ints),
[](char c) {
return c - '0';
}
);
これは、文字列の最初から最後までループし、各文字を取得し、その値からマイナス'0'
('5' - '0'
5)をベクトルの最後に加算して、同等の整数のベクトルを残します。何よりも、それは車輪の再発明ではありません!
また、次の2つの問題も解決します。
std::vector
可変長配列(VLA)の代わりに使用します。後者は非標準であるため、ランタイムサイズの配列が必要な場合はベクトルをお勧めします。
を使用するatoi
と、エラーが発生すると0が返され、結果が0であるか、エラーが発生したかがわからないため、それ自体は不良です。また、単一の文字ではなく、文字列を取ります。代わりに、これはとの間の距離を見つけ'0'
ます。これは必要な整数です。
セキュリティを強化するためisdigit
に、文字が数字であるかどうかを確認するために使用できます。そうでない場合は、何らかのエラー(例外など)を発生させるか、それ以外の方法で対処します。これにより、ints
ベクトルの数字が0から9になり、たとえば25の数字になることはありません。