【问题标题】:Spitting streams then parsing [closed]吐出流然后解析[关闭]
【发布时间】:2014-11-11 03:43:34
【问题描述】:
vector<double> grades;
vector<double>::iterator it;

在类中定义。

Grades::Grades(string str){
    istringstream obj(str);
    string y;
    while(obj>>y)
    double num;
    stringstream convert(y);
    if(!(convert>>num))
    num=0.0;
    grades.push_back(num);
    }
}

Grades 是一个包含双精度向量的类。目标是首先用“”分割字符串,然后解析每个分解的片段以键入双精度。这是正确的方法吗?还有其他更简单的方法吗?

【问题讨论】:

  • 不,我不明白循环的必要性。不应该是while (obj &gt;&gt; y)吗?
  • @remyabel 是的,我从文件中复制了错误的代码。我现在要编辑。
  • 好吧,不要将你的代码编辑成不是你真正代码的东西。
  • 为什么需要字符串?只需while(obj &gt;&gt; num)
  • @user657267 我必须先拆分字符串“str”。然后对于每个元素拆分,我必须将其转换为双精度,最后将其添加到向量中。还是我错过了什么?

标签: c++ parsing vector split


【解决方案1】:

@user657267 提出了一个有效的观点。您的代码可以简化为:

std::istringstream iss(str);
double num = 0.0;
while (iss >> num)
{
    grades.push_back(num);
}

没有理由需要中介 stringstream。请注意,如果字符串中间有无效输入,这将提前失败。我确信有更好的方法来完成以下操作,但是您可以忽略无效输入并在 EOF 时退出循环。

std::istringstream iss(str);
double num = 0.0;
while (true)
{
    if (!(iss >> num))
    {
        if (!iss.eof())
        {
            iss.clear();
            iss.ignore(std::numeric_limits<std::streamsize>::max(), ' ');
        } else
            break;
    } else {
        grades.push_back(num);
    }
}

另外,清理字符串的一种原始方法是使用擦除删除习语。任何不是数字、点或空格的东西都会被清除。

bool pred(char c)
{
    return (!std::isdigit(c) && c != '.' && c != ' ');
}

str.erase(std::remove_if(str.begin(), str.end(), pred), str.end());

这将允许您使用第一种形式。

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多