gpt4 book ai didi

c++ - 简单的 istream_iterator 问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:37 26 4
gpt4 key购买 nike

我是 C++ 的新手,如果这是一个愚蠢的问题,我深表歉意。我似乎无法弄清楚为什么这不起作用。它复制到第一个 vector 中,似乎跳过了第二个复制调用。

#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

int main ()
{
vector<int> first;
vector<int> second;

copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(first));
cin.clear();
copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(second));
return 0;
}

我想使用复制函数将 istream_iterator 输入读取到任意数量的 vector 中(每个 vector 调用一次复制)。换句话说:我希望能够在控制台中输入“1 2 3 4 5 ctrl+d”,并将 1,2,3,4,5 输入到第一个 vector 中。然后在控制台中输入“6 7 8 9 10 ctrl+d”,将 6,7,8,9,10 输入到第二个 vector 中。

问题是,在我向第一个 vector 输入一些输入并按下 control+d 后,不管 cin 的失败状态如何,cin 的 istream_iterator 仍然等于 istream_iterator()。这会导致对“复制”的每个后续调用都失败(因为 istream_iteratorcin 已经等于 istream_iterator(),程序将其解释为 eof)。所以我的问题是:我需要做什么来“重置”迭代器和 cin 流? cin.clear() 确实清除了所有失败位。然而,不管怎样,istream_iterator(cin) 仍然等于 istream_iterator()。据我了解,当流处于失败状态时,绑定(bind)到流的 istream_iterators 应该只等于默认的 istream_iterator 值。我错过了什么?

最佳答案

istream_iterator是一个输入迭代器,这意味着您只能取消引用每个迭代器值一次。你实际上是在从一个流中读取,没有寻找或返回。因此,一旦到达流的末尾,就没有更多可输入的内容,第二个范围为空。

为什么不直接说 vector<int> second(first);复制一份?


更新:在你澄清问题后,这里有一个新的答案:你误解了如何stdin作品。只有一个输入。 Ctrl-D不是 C++ 固有的任何东西;相反,这是您平台的约定,当您发出 Ctrl-D 信号时,您的平台将终止输入缓冲区。 .之后,输入的"file"就完成了,不能再往里面写入数据了。

不过,您的方法有点非正统。通常,您会逐行阅读,以 Enter 分隔。 , 并标记每一行。使用字符串流,您会得到非常相似的代码:

std::string line;
std::vector<int> first, second;

// Read line 1
if (std::getline(std::cin, line))
{
std::istringstream iss(line);
std::copy(std::istream_iterator<int>(iss), std::istream_iterator<int>(), std::back_inserter(first));
}
else { /* error */ }

// Read line 2
if (std::getline(std::cin, line))
{
std::istringstream iss(line);
std::copy(std::istream_iterator<int>(iss), std::istream_iterator<int>(), std::back_inserter(second));
}
else { /* error */ }

关于c++ - 简单的 istream_iterator 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7435713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com