从char构造字符串流

Construct stringstream from char

本文关键字:字符串 char      更新时间:2023-10-16

我实现了以下代码,它做了它应该做的事情,但我认为它可以/应该简化。

基本上,我需要创建一个数字向量,每个数字都包含testString中的一个数字。有没有任何方法可以直接从一个字符(例如testString[i])构造字符串流?如果可以用C++的方式实现,我宁愿不涉及C风格的函数,比如atoi。

#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');

查看我的原始评论;从每个数字字符中减去CCD_ 4。

#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'));
相关文章: