【问题标题】:How to copy a list of numbers from a string to a C++ vector如何将数字列表从字符串复制到 C++ 向量
【发布时间】:2015-03-28 23:22:19
【问题描述】:

我有一个类似的字符串:

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

我想将其中的数字复制到 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>());

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

row={6}

虽然我想得到

row={6,148,72,35,0,33.6,0.627,50,1}

如果我改用 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));

读取第一个数字后,字符串中的复制似乎结束了,我不知道为什么。知道如何使用 assign() 或 copy() 将字符串中的每个数字复制到向量中吗?

【问题讨论】:

  • std::replace(line.begin(), line.end(), ',', ' '); 在定义 iss 之前,如 here
  • @PiotrS。就在现场。现在我想知道,有没有办法避免更换?类似于将分隔符定义为,?
  • @AdriC.S.是的!但是,在您的情况下,我认为替换更可取:stackoverflow.com/a/28197337/2642059
  • @JonathanMee 我明白了!感谢您的链接!
  • @AdriC.S.是的,如果设置 istreams 以读取 CSV 是您必须做的很多事情,您可以创建一个 const ctype&lt;char&gt;::mask 并在任何地方使用它。但如果只是这个地方,我会支持replace,因为老实说,没有人会使用ctype&lt;char&gt;::mask,所以它会让你的代码难以理解。

标签: c++ c++11 vector stl stringstream


【解决方案1】:

如果您的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>()};

请注意,gcc 有一个 bug 并移动了一个 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>()};

谢天谢地,这个错误已经在 gcc 5 中修复了,所以我们快到了。

【讨论】:

    猜你喜欢
    • 2019-12-08
    • 2020-08-02
    • 2016-05-03
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2023-03-17
    相关资源
    最近更新 更多