异常情况:检查元素是否已经存在于数组c++中



我目前正在学习c++。我陷入了这个小问题,只有一个例外。

一个程序要求用户在一个数组中输入5个整数。我需要该程序来管理一个异常,该异常请求在元素已经存在的情况下再次输入该元素。

这是我的代码,我计算出了全局结构,但问题是如果你输入0,程序会抛出一个异常"已经存在";,那不是我想要的结果。我知道这是从哪里来的,T[j]没有在for循环中定义,但我不知道如何处理它。有人能帮我改进它吗?其他解决方案也受到欢迎。

#include<iostream>
#include <vector>
#include<cstdlib>
using namespace std;
int main(){
int i=0,j=0;
int temp;
vector<int>T(5); 
do{
try{
cout<<"user input "<<(i+1)<<":";
cin>>temp;
//T[j]= 'a000000000000000000'; //I tried to define T[j], that's maximum I can do
for(j=0;j<=i;j++){
if(T[i]==T[j])
throw(0);
}

T[i]=temp;
i++;
}
catch(const int){
cout<<"Error: value already exists, try again"<<endl;
}
} while(i<sizeof(T)/sizeof(int));
for(i=0;i<sizeof(T)/sizeof(int);i++){
cout<<T[i]<<endl;
}
return 0;
}

此行创建一个包含5个int的向量。矢量中的所有int都为零:

vector<int>T(5); 

这条线运行一个循环。由于i为零,它运行循环一次,其中j等于零,因为j<=i为真,因为它们都为零。

for(j=0;j<=i;j++){

这行检查T[i]是否等于T[j],因为ij都为零,而T[0]等于T[0]

if(T[i]==T[j])

这一行抛出一个异常。

throw(0);

你发现虫子了吗?也许您不想运行j等于i的循环。也许您想在j<i而不是j<=i时循环。因此,如果i为5,则j从0变为4,而不是0变为5;如果i为0,则循环根本不运行。

此外,正如Mark Ransom所指出的,这是错误的:

sizeof(T)/sizeof(int)

应该是

T.size()

sizeof(T)/sizeof(int)适用于数组,但不适用于向量。您需要T.size()

如果不要求数字以与输入相同的顺序输出,那么std::set(或std::unordered_set(将很好地工作

#include <iostream>
#include <set>
int main()
{
constexpr int NUMBERS_TO_READ{5};
std::set<int> numbers;
int i = 0;
do
{
int temp;
std::cout << "user input " << (i+1) << std::endl;
std::cin >> temp;
if (numbers.find(temp) != numbers.end())
{
//temp is already in the set
std::cout << "Value " << temp << " already exists, try again!" << std::endl;
}
else
{
//temp isn't in the set. add it.
numbers.insert(temp);
i++;
}

}
while (i < NUMBERS_TO_READ);
for (const auto num : numbers) std::cout << num << std::endl;   
}

相关内容

最新更新