如何将字符串中的数字列表复制到C++向量

Fan*_*nta 4 c++ stl vector stringstream c++11

我有一个字符串:

string line="6,148,72,35,0,33.6,0.627,50,1";
Run Code Online (Sandbox Code Playgroud)

我想将其中的数字复制到std :: vector的各个元素中.我想使用std :: vector.assign()或std :: copy().

所以我写道:

string line="6,148,72,35,0,33.6,0.627,50,1";
vector<double> row;
istringstream iss { line };
row.assign(istream_iterator<double>(iss), istream_iterator<double>());
Run Code Online (Sandbox Code Playgroud)

但结果是assign()只将字符串中的第一个数字复制到向量,即得到

row={6}
Run Code Online (Sandbox Code Playgroud)

虽然我想得到

row={6,148,72,35,0,33.6,0.627,50,1}
Run Code Online (Sandbox Code Playgroud)

如果我使用std :: copy,就像在:

string line="6,148,72,35,0,33.6,0.627,50,1";
vector<double> row;
istringstream iss { line };
copy(istream_iterator<double>(iss), istream_iterator<double>(), back_inserter(row));
Run Code Online (Sandbox Code Playgroud)

看完第一个数字后,看起来字符串的副本结束,我不知道为什么.知道如何使用assign()或copy()将字符串中的每个数字复制到向量中吗?

Jon*_*Mee 5

如果您做string对了,您可以使用Visual Studio 2013在一行中完成所有操作:

string line="6,148,72,35,0,33.6,0.627,50,1";

std::replace(line.begin(), line.end(), ',', ' ');

vector<double> row{istream_iterator<double>(istringstream(line)), istream_iterator<double>()};
Run Code Online (Sandbox Code Playgroud)

请注意,gcc有一个移动的错误,istream所以你必须在gcc上执行此操作:

string line="6,148,72,35,0,33.6,0.627,50,1";

std::replace(line.begin(), line.end(), ',', ' ');

istringstream bar(line);

vector<double> foo{istream_iterator<double>(bar), istream_iterator<double>()};
Run Code Online (Sandbox Code Playgroud)

值得庆幸的是,这个bug已经在gcc 5中修复了,所以我们差不多了.