函数,用于在C++中高效解析带有分隔符的多个数字

Function for efficient parsing of multiple numbers with delimiter in C++

本文关键字:分隔符 数字 用于 C++ 高效 函数      更新时间:2023-10-16

下面的函数只需取一个用64位整数填充的字符串,每个值由一个分隔符分隔,该分隔符将被放入向量中。

vector<unsigned long long int> getAllNumbersInString(string line, char delim){
    vector<unsigned long long int> v;
    string word;
    stringstream stream(line);
    unsigned long long int num;
    while(getline(stream, word, delim))
        num = atol(word.c_str());
        v.push_back(num);
    }
    return v;
}

例如,当我们使用","作为分隔符时,此函数可以正常工作,但是,如果字符串变量"line"中的数据如下所示,则分隔符将失败:

     432   12332    2234   12399   

虽然数据似乎使用空白作为分隔符,但使用上面的代码,整个代码将在逻辑上失败。例如,空白之间的空白是未定义的,atol将返回0,并将这些0放入向量中。

为了更好地防范这些失范行为,我应该在这个代码中采取哪些措施?

是否有什么原因不能/不只是使用这样的东西?:

while (stream >> num)
   v.push_back(num);

或者只是:

vector<unsigned long long int> getAllNumbersInString(string line) { 
    istringstream stream(line);  
    typedef unsigned long long int T;
    vector<T> v((istream_iterator<T>(stream)), istream_iterator<T>());
    return v;
}

如果您必须处理除空白之外的分隔符,则可以创建一个ctype方面来指定其他应被视为分隔符的内容。

您可以让iostreams库为您处理空白:

unsigned long long int num;
while(stream >> num)
    v.push_back(num);