鱼C论坛

 找回密码
 立即注册
查看: 840|回复: 1

[已解决]C++流迭代器

[复制链接]
发表于 2023-11-19 21:21:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        ifstream aa("data.txt");
        ofstream bb("out.txt");
        istream_iterator<int>  in(aa),eof;
        ostream_iterator<int>  on(bb," ");
        vector<int> data(in, eof);
        auto kk = find_if(data.begin(),data.end(),[](const int &a) {return a%2 == 0;});
        data.erase(kk,data.end());
         if (kk != data.end()) {
        data.erase(kk, data.end());
    }
        copy(data.begin(),data.end(),on);

一下是data.txt

123 10 20 30
456 798 456 859
本意是打印偶数,而这个程序却只打印了了123,这是为什么,哪里有问题吗?
最佳答案
2023-11-19 21:21:57
在你提供的代码中,存在一些问题导致程序没有按预期工作。我来帮你找出问题所在。

首先,让我们来看一下代码中的问题:
ifstream aa("data.txt");ofstream bb("out.txt");istream_iterator<int> in(aa), eof;ostream_iterator<int> on(bb, " ");vector<int> data(in, eof);auto kk = find_if(data.begin(), data.end(), [](const int &a) {return a % 2 == 0;});data.erase(kk, data.end());if (kk != data.end()) {    data.erase(kk, data.end());}copy(data.begin(), data.end(), on);
在这段代码中,你首先从文件"data.txt"中读取数据到data向量中,然后使用find_if查找第一个偶数,并删除其之后的所有元素。接着又尝试删除一遍,这会导致问题。

解决办法是在找到偶数后不要立即删除,而应该先找到所有偶数的位置,然后再统一删除。下面是修改后的代码:
ifstream aa("data.txt");ofstream bb("out.txt");istream_iterator<int> in(aa), eof;ostream_iterator<int> on(bb, " ");vector<int> data(in, eof);// 找到所有偶数的位置auto evenEnd = remove_if(data.begin(), data.end(), [](int a){ return (a % 2) != 0; });// 删除后面的非偶数元素data.erase(evenEnd, data.end());// 将偶数数据写入文件copy(data.begin(), data.end(), on);
通过使用remove_if算法,我们可以将不满足条件的元素移动到容器的尾部,并得到一个迭代器evenEnd,指向第一个不满足条件的元素。然后我们删除evenEnd之后的所有元素,并将偶数数据写入文件。

希望以上修改能够解决你的问题。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-19 21:21:57 | 显示全部楼层    本楼为最佳答案   
在你提供的代码中,存在一些问题导致程序没有按预期工作。我来帮你找出问题所在。

首先,让我们来看一下代码中的问题:
ifstream aa("data.txt");ofstream bb("out.txt");istream_iterator<int> in(aa), eof;ostream_iterator<int> on(bb, " ");vector<int> data(in, eof);auto kk = find_if(data.begin(), data.end(), [](const int &a) {return a % 2 == 0;});data.erase(kk, data.end());if (kk != data.end()) {    data.erase(kk, data.end());}copy(data.begin(), data.end(), on);
在这段代码中,你首先从文件"data.txt"中读取数据到data向量中,然后使用find_if查找第一个偶数,并删除其之后的所有元素。接着又尝试删除一遍,这会导致问题。

解决办法是在找到偶数后不要立即删除,而应该先找到所有偶数的位置,然后再统一删除。下面是修改后的代码:
ifstream aa("data.txt");ofstream bb("out.txt");istream_iterator<int> in(aa), eof;ostream_iterator<int> on(bb, " ");vector<int> data(in, eof);// 找到所有偶数的位置auto evenEnd = remove_if(data.begin(), data.end(), [](int a){ return (a % 2) != 0; });// 删除后面的非偶数元素data.erase(evenEnd, data.end());// 将偶数数据写入文件copy(data.begin(), data.end(), on);
通过使用remove_if算法,我们可以将不满足条件的元素移动到容器的尾部,并得到一个迭代器evenEnd,指向第一个不满足条件的元素。然后我们删除evenEnd之后的所有元素,并将偶数数据写入文件。

希望以上修改能够解决你的问题。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 00:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表