使用while循环分别对两个vector进行赋值,该怎么做

news/2024/11/16 16:00:58/文章来源:https://www.cnblogs.com/hisun9/p/18549420

问题

在写程序的时候遇到了这样一个问题,见代码

#include <iostream>
#include <vector>using namespace std;bool isequal(vector<int> vshort, vector<int> vlong)
{for (int index = 0; index != vshort.size(); index++)if (vshort[index] != vlong[index])return false;return true;
}int main()
{vector<int> v1;vector<int> v2;int n;while (cin >> n)v1.push_back(n);while (cin >> n)v2.push_back(n);if (v1.size() <= v2.size())cout << isequal(v1, v2) << endl;elsecout << isequal(v2, v1) << endl;return 0;
}   

结果没有达到想要的效果(即正确对两个vector赋值)

可以看下这篇博客应该能明白为什么是错误的写什么代码来清空缓冲区

这段代码目前在接受输入时,将所有的用户输入依次存储到v1 和 v2 中,但它会因为 cin 连续输入的问题导致输入难以区分,造成逻辑错误。如果想要正确设置 v1 和 v2 的值,可以通过以下方式修改代码:

改进方法

方法 1:指定每组的长度

让用户先输入每组数据的长度,然后依次读取指定数量的数据。

#include <iostream>
#include <vector>using namespace std;bool isequal(vector<int> vshort, vector<int> vlong)
{for (int index = 0; index != vshort.size(); index++)if (vshort[index] != vlong[index])return false;return true;
}int main()
{vector<int> v1, v2;int n, size1, size2;// 输入第一组数据的长度和内容cout << "输入第一组数据的长度:";cin >> size1;cout << "输入第一组数据:";for (int i = 0; i < size1; ++i){cin >> n;v1.push_back(n);}// 输入第二组数据的长度和内容cout << "输入第二组数据的长度:";cin >> size2;cout << "输入第二组数据:";for (int i = 0; i < size2; ++i){cin >> n;v2.push_back(n);}if (v1.size() <= v2.size())isequal(v1, v2) ? cout << "v1是v2的前缀" << endl: cout << "v1 和 v2 之间不存在前缀关系" << endl;elseisequal(v1, v2) ? cout << "v2是v1的前缀" << endl: cout << "v1 和 v2 之间不存在前缀关系" << endl;return 0;
}

输出如下:

img

方法 2:使用特殊分隔符

用一个非整数值(如 end)或其他特定分隔符来标记输入结束。

#include <iostream>
#include <vector>
#include <string>using namespace std;bool isequal(vector<int> vshort, vector<int> vlong)
{for (int index = 0; index != vshort.size(); index++)if (vshort[index] != vlong[index])return false;return true;
}int main()
{vector<int> v1, v2;int n;string input;// 输入第一组数据cout << "输入第一组数据(以 end 结束):";while (cin >> input && input != "end"){n = stoi(input);v1.push_back(n);}// 输入第二组数据cout << "输入第二组数据(以 end 结束):";while (cin >> input && input != "end"){n = stoi(input);v2.push_back(n);}if (v1.size() <= v2.size())isequal(v1, v2) ? cout << "v1是v2的前缀" << endl: cout << "v1 和 v2 之间不存在前缀关系" << endl;elseisequal(v1, v2) ? cout << "v2是v1的前缀" << endl: cout << "v1 和 v2 之间不存在前缀关系" << endl;return 0;
}

输出如下:

img

想了解下stio函数的话,可以看下这篇博客stoi函数介绍

方法 3:使用分行输入

通过每组数据分行输入,每行数据代表一个向量。

#include <iostream>
#include <vector>
#include <sstream>using namespace std;bool isequal(vector<int> vshort, vector<int> vlong)
{for (int index = 0; index != vshort.size(); index++)if (vshort[index] != vlong[index])return false;return true;
}vector<int> parseLine(const string& line)
{vector<int> vec;int num;stringstream ss(line);while (ss >> num)vec.push_back(num);return vec;
}int main()
{vector<int> v1, v2;string line;// 输入第一组数据cout << "输入第一组数据(单独一行):";getline(cin, line);v1 = parseLine(line);// 输入第二组数据cout << "输入第二组数据(单独一行):";getline(cin, line);v2 = parseLine(line);if (v1.size() <= v2.size())isequal(v1, v2) ? cout << "v1是v2的前缀" << endl: cout << "v1 和 v2 之间不存在前缀关系" << endl;elseisequal(v1, v2) ? cout << "v2是v1的前缀" << endl: cout << "v1 和 v2 之间不存在前缀关系" << endl;return 0;
}

输出如下:

img

关于streamstring的介绍,可以看下这篇博客 streamstring类介绍

总结

  • 指定长度法(方法 1):适合输入大小固定的情况。

  • 特殊分隔符法(方法 2):适合不定长输入,但要求用户清楚规则。

  • 分行输入法(方法 3):最通用且直观,推荐用于实际开发中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834643.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

合并具有文本框的Word文档:VBA代码批量操作

本文介绍基于VBA语言,对大量含有图片、文本框与表格的Word文档加以批量自动合并,并在每一次合并时添加分页符的方法~本文介绍基于VBA语言,对大量含有图片、文本框与表格的Word文档加以批量自动合并,并在每一次合并时添加分页符的方法。在我们之前的文章中,介绍过基于Pytho…

streamstring类介绍

std::stringstream 是 C++ 标准库中提供的一个类,定义在头文件 <sstream> 中。它是基于字符串的流(stream),允许像操作输入流(std::cin)或输出流(std::cout)那样,操作字符串内容。 std::stringstream 是 std::iostream 的派生类,支持同时进行字符串解析(输入)…

爬虫

程序示例: import java.util.regex.Matcher; import java.util.regex.Pattern;public class RegexDemo6 {public static void main(String[] args) {/** 有如下文本, 请按照要求爬取数据. * Java 自从 95 年问世以来, 经历了很多版本, 目前企业中用的最多的是 Java8 和 Java11,…

将数值转换为字符串的函数

在 C++ 中,itoa 和 sprintf 是用于将数值转换为字符串的经典函数。然而,它们有一定的局限性或者安全性问题,现代 C++ 更倾向于使用标准库的解决方案,如 std::to_string 和 std::stringstream,来代替这些函数。 1. itoa 的替代 itoa 是一种将整数转换为字符串的函数,但它不…

20222406 2024-2025-1 《网络与系统攻防技术》实验五实验报告

20222406 2024-2025-1 《网络与系统攻防技术》实验五实验报告 1.实验内容对网站进行 DNS 域名查询,包括注册人、IP 地址等信息,还通过相关命令查询 IP 地址注册人及地理位置。尝试获取 QQ 好友 IP 地址并查询其地理位置。使用 nmap 对靶机环境扫描,获取靶机 IP 活跃状态、开…

delphi 新版内存表 FDMemTable

c++builder XE 官方demo最全60多个 http://community.embarcadero.com/blogs?view=entry&id=8761FireDAC.Comp.Client用好FDMemTable代替之前的ClientDataSet,以前ClientDataSet内存表转换太繁琐了步骤。TClientDataSet *cds = new TClientDataSet(this); DataSetProvid…

理想雪 - 翠鸟协会

写在前面3844 字 | 小说 | 热爱 | 思考 | 表达 | 坚定 | 证明 | 坚守《理想雪》系列故事均为架空世界观,所有人名、地名等与现实世界无任何关联。该系列只且仅只为了说明,小说作者在该情境下会诞生的想法和采取的行动,以及背后的世界观、价值观和人生观。因此将具有强烈的个…

专题课:综合案例5

评委打分解答: 1.首先肯定要键盘录入6个评委的分数6个评委的分数,即6个变量,我们肯定用数组更加方便,因为后面求和求最大值之类的,用数组都更简单 遍历数组,我们每键盘打出一个元素就将其放入数组中 . 2.然后定义求和变量,将6个分数求和3.for循环搭配if筛选求最大、最小…

# 20222403 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 本实践目标是掌握metasploit的用法。 指导书参考Rapid7官网的指导教程。 https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide/ 下载官方靶机Metasploitable2,完成下面实验内容。 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search一…

_app搭建笔记

逍遥模拟器端口号:21503 (3)adb install +包名的绝对路径 安装apk包 案例:adb install E:\dcs\two\app\mojibase.apk E:\dcs\two\app\baiduyuedu_5520.apk (4)活动路径名: aapt d badging D:\app\baiduyuedu_3760.apk(5)adb uninstall 包名:卸载 com.baidu.yued…

20222323 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 掌握metasploit的用法。 下载官方靶机Metasploitable2,完成下面实验内容。 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search一下就可以use) ②端口扫描:可以直接用nmap,也可以用Aux中的portscan/tcp等。 ③选做:也可以扫系统版本、漏洞等。 (2)Vsft…

InDesign 2025 for Mac(Id2025)最新激活版20.0.0

InDesign 2025具备强大的功能和灵活的扩展性,支持插件扩展,用户可以根据自身需求自定义工具和工作流程。在处理复杂排版和多页面设计时,InDesign 2025注重用户界面的友好性与功能的直观性,即使是新手用户也能快速上手。 InDesign 2025增强了多模态图文编辑能力,使得图像与…