Построить поток строк из символа

Я реализовал следующий код, который делает то, что должен, но я думаю, что он может / должен быть упрощен.

По сути, мне нужно создать вектор чисел, каждый из которых содержит одну из цифр, найденных в testString. Есть ли способ построить поток строк непосредственно из символа (т. Е. TestString [i])? Я бы предпочел не задействовать функции в стиле C, такие как atoi, если это можно сделать способом C ++.

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

int main ()
{
std::string testString = "abc123.bla";
std::string prefix = "abc";

std::vector<unsigned short> digits;

if (0 == testString.find(prefix))
{
for (size_t i = prefix.size(); i < testString.find("."); ++i)
{
int digit;
std::stringstream digitStream;
digitStream << testString[i];
digitStream >> digit;
digits.emplace_back(digit);
}
}

for (std::vector<unsigned short>::iterator digit = digits.begin(); digit < digits.end(); ++digit)
{
std::cout << *digit << std::endl;
}

return 0;
}

0

Решение

Если предположить, testString[i] находится между '0' а также '9', просто делать:

digits.emplace_back(testString[i] - '0');
1

Другие решения

Увидеть мой оригинальный комментарий; вычитать '0' от каждого символа цифры.

#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cctype>
#include <functional>
#include <iostream>

...

std::string input = "abc123.bla";
std::string prefix = "abc";
std::vector<unsigned short> digits;

auto input_b = input.begin();
std::copy_if(input_b, std::find(input_b, input.end(), '.'),
std::back_inserter(digits), (int (*)(int)) std::isdigit);

auto digits_b = digits.begin();
auto digits_e = digits.end();
std::transform(digits_b, digits_e, digits_b,
std::bind2nd(std::minus<unsigned short>(), '0'));
std::copy(digits_b, digits_e,
std::ostream_iterator<unsigned short>(std::cout, "\n"));

Это может быть даже сокращено, если вам не нужно digits содержать промежуточные цифры.

std::transform(digits.begin(), digits.end(),
std::ostream_iterator<unsigned short>(std::cout, "\n"),
std::bind2nd(std::minus<unsigned short>(), '0'));
1

По вопросам рекламы [email protected]