[英]Construct stringstream from char
我實現了以下代碼,它完成了它應該做的事情,但我認為它可以/應該簡化。
基本上,我需要創建一個數字向量,每個數字包含一個在testString中找到的數字。 有沒有辦法直接從char構造stringstream(即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;
}
假設testString[i]
在'0'
和'9'
,那么就這樣做:
digits.emplace_back(testString[i] - '0');
看我原來的評論 ; 從每個數字字符中減去'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'));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.