问题描述
我已将代码更改为向量。现在,我试图找到并集,交叉点和A-B。我的联合和交叉口代码现在都可以使用。我不知道该怎么做。我想我可以带A,如果==到B,则不插入它,但仍然把它们放进去。
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <fstream>
#include <algorithm>
using namespace std;
void Union();
void Intersection();
void Difference();
int main()
{
Union();
Intersection();
Difference();
return 0;
}
void SetVectors()
{
}
void Union()
{
int temp = 0;
vector<int> U{};
vector<int> A{3,4,9,12,13,15,16,17};
vector<int> B{1,3,5,7,9};
for(int i = 0; i < A.size(); i++)
{
for (int j = 0; j < B.size(); j++)
{
if (A[i] != B[j])
{
int temp = A[i];
U.push_back(temp);
temp = B[j];
U.push_back(temp);
}
//Used To Sort The Vector So There Is No Duplicates And Its In Order!
sort( U.begin(),U.end() );
U.erase( unique( U.begin(),U.end() ),U.end() );
}
}
cout << "Union: ";
for(int z = 0; z < U.size(); z++)
{
cout << U[z] << " ";
}
}
void Intersection()
{
int temp = 0;
vector<int> U{};
vector<int> A{3,15};
//Used To Sort The Vector So There Is No Duplicates And Its In Order!
sort( A.begin(),A.end() );
A.erase( unique( A.begin(),A.end() ),A.end() );
vector<int> B{1,9};
//Used To Sort The Vector So There Is No Duplicates And Its In Order!
sort( B.begin(),B.end() );
B.erase( unique( B.begin(),B.end() ),B.end() );
for(int i = 0; i < A.size(); i++)
{
for (int j = 0; j < B.size(); j++)
{
if (A[i] == B[j])
{
int temp = A[i];
U.push_back(temp);
temp = B[j];
U.push_back(temp);
}
//Used To Sort The Vector So There Is No Duplicates And Its In Order!
sort( U.begin(),U.end() );
}
}
cout << "Intersection: ";
for(int z = 0; z < U.size(); z++)
{
cout << U[z] << " ";
}
}
void Difference()
{
int temp = 0;
vector<int> D{};
vector<int> A{3,15};
vector<int> B{1,9};
for(int i = 0; i < A.size(); i++)
{
for (int j = 0; j < B.size(); j++)
{
if (A[i] == B[j])
{
cout << A[i];
}
else
{
int temp = A[i];
D.push_back(temp);
}
//Used To Sort The Vector So There Is No Duplicates And Its In Order!
sort( D.begin(),D.end() );
D.erase( unique( D.begin(),D.end() ),D.end() );
}
}
cout << "Difference: ";
for(int z = 0; z < D.size(); z++)
{
cout << D[z] << " ";
}
}
解决方法
我们可以提供的最佳帮助是说“不要那样做……”继续声明int A [MaxSizeA];
,而MaxSizeA
为零时试图声明非标准包含零个元素的可变长度数组(VLA)。那行不通。对于初学者来说,VLA不是C ++的一部分,某些编译器仅将它们作为非标准编译器扩展提供。
令人困惑的是,您#include <vector>
很棒,这就是您想用来存储未知数量的对象的方法-但是,您无法在代码中使用std::vector。 / p>
在研究如何使用std::vector
完成要完成的工作之前,请快速浏览Why is “using namespace std;” considered bad practice?。尽早学习好习惯比晚些摆脱坏习惯要容易得多。
std :: vector
std::vector
允许您向集合中添加任意数量的对象,并且内存管理是自动处理的。在您的情况下,您可以要求MaxSizeA
和MaxSizeB
,然后循环播放,直到用户为每个元素提供了许多 valid 元素为止。以A
为例,您可以这样做:
#include <limits>
...
std::vector<int> A{},B{};
size_t MaxSizeA,MaxSizeB;
int val;
std::cout << "How Many Values Do You Wish To Enter For A: ";
if (!(std::cin >> MaxSizeA)) {
std::cerr << "error: invalid integer input.\n";
return 1;
}
while (A.size() < MaxSizeA) {
std::cout << "Enter Values For A[" << A.size() << "]: ";
if (std::cin >> val)
A.push_back(val);
else {
std::cerr << " error: invalid integer input.\n";
std::cin.clear();
std::cin.ignore (std::numeric_limits<std::streamsize>::max(),'\n');
}
}
在声明main()
局部的向量和变量的地方,这里没有理由使用 global 变量(实际上,除非绝对必要,否则应避免使用它们)。调用MaxSizeA
后,提示您输入std::cin
,然后 验证 流状态,以确保{{1 }}。然后,您只需循环运行,直到MaxSizeA
确保您的用户提供了A.size() == MaxSizeA
个有效的整数输入。您可以通过重置流状态然后使用MaxSizeA
清除到输入末尾来处理失败的输入。不需要计数器,您可以简单地使用std::cin.ignore()
和A.size()
来确定每个向量中存储的元素的当前数量。
(您还可以检查B.size()
和std::cin.eof()
来捕获手动生成std::cin.bad()
的用户,或者捕获到不可恢复的流错误-留给您。)
您可以使用Range-based for loop (since C++11)输出每个向量的内容,例如
EOF
将其放入与您尝试的示例类似的示例中:
std::cout << "\narray A:\n";
for (auto& v : A)
std::cout << v << '\n';
使用/输出示例
运行程序并故意提供错误的输入以行使您可以执行的错误处理:
#include <iostream>
#include <vector>
#include <limits>
int main() {
std::vector<int> A{},'\n');
}
}
std::cout << "\nHow Many Values Do You Wish To Enter For B: ";
if (!(std::cin >> MaxSizeB)) {
std::cerr << "error: invalid integer input.\n";
return 1;
}
while (B.size() < MaxSizeB) {
std::cout << "Enter Values For B[" << B.size() << "]: ";
if (std::cin >> val)
B.push_back(val);
else {
std::cerr << " error: invalid integer input.\n";
std::cin.clear();
std::cin.ignore (std::numeric_limits<std::streamsize>::max(),'\n');
}
}
std::cout << "\narray A:\n";
for (auto& v : A)
std::cout << v << '\n';
std::cout << "\narray B:\n";
for (auto& v : B)
std::cout << v << '\n';
}
仔细检查一下,如果还有其他问题,请告诉我。