我的数组最多只能增加3个值,而我的第二个数组会重复用户输入到第二个数组中的任何内容

问题描述

我已将代码更改为向量。现在,我试图找到并集,交叉点和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允许您向集合中添加任意数量的对象,并且内存管理是自动处理的。在您的情况下,您可以要求MaxSizeAMaxSizeB,然后循环播放,直到用户为每个元素提供了许多 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';

}

仔细检查一下,如果还有其他问题,请告诉我。