【问题标题】:Reading line of integers directly into vector将整数行直接读入向量
【发布时间】:2019-05-11 06:24:49
【问题描述】:

我正在通过cin读取一个文件的内容,我需要解析第一行

文件如下:

1 2 3 4
1->3
2->5
...

所以基本上我的第一步是将第一行读入一个整数向量。

我的方法如下:

std::string line;
std::vector<int> initial;

std::getline(std::cin, line);
std::istringstream iss(line);
int aux;

while (iss >> aux) {
    initial.push_back(aux);
}

这有效,我的向量initial 正确包含第一行的 4 个整数。 但是我觉得我正在做很多应该可以以更直接的方式完成的转换。

我正在将第一行读入一个字符串,然后将这个字符串转换成一个流,我尝试直接读入一个流但编译器抱怨。

std::istringstream iss();
std::getline(std::cin, iss);

然后我遍历字符串以获取单个整数并将它们保存在辅助整数中,然后再推入向量中。 我尝试直接将它们放入向量中,但又不可能(至少我这样做的方式)

while (iss >> initial) {
}

有没有一种更简洁的方法可以将由空格分隔的整数组成的 cin 中的一行直接转换为整数向量?

【问题讨论】:

标签: c++ vector cin


【解决方案1】:

我会从头开始:

while (iss >> initial) { ... }

使用std::back_inserter 可以轻松实现这一点:

std::vector<int> v;
auto inserter = std::back_inserter(v);

while (iss >> *inserter) { ... }

坦率地说,我可能会保持原样,但如果你绝对必须,你可以使用std::istream_iterator 直接初始化向量:

std::vector<int> v (std::istream_iterator<int>{iss}, std::istream_iterator<int>{});

注意:在istream_iterator的构造函数中使用大括号,或者在v的构造函数的至少一个参数周围使用括号以避免Most-Vexing-Parse

【讨论】:

    猜你喜欢
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    相关资源
    最近更新 更多