-1

我已将我的代码更改为向量。现在我正在尝试找到联合、交叉点和 AB。我的 Union 和 Intersection 代码现在正在运行。我不知道如何做我的区别。我想我可以拿 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, 4, 9, 12, 13, 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, 3, 5, 7, 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() );
              U.erase( unique( U.begin(), U.end() ), 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, 4, 9, 12, 13, 15};

    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])
            {
                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] << " ";
    }
}
4

1 回答 1

1

我们可以提供的最佳帮助是说“不要那样做......” 继续int A [MaxSizeA];声明注释,而is zero 试图声明一个具有零元素MaxSizeA的非标准可变长度数组(VLA)。那是行不通的。对于初学者,VLA 不是 C++ 的一部分,并且仅由某些编译器作为非标准编译器扩展提供。

令人困惑的是,你#include <vector>很棒——这就是你想要用来存储未知数量的对象的东西——但是,你没有在代码中使用std::vector

在查看如何使用std::vector来完成您想要做的事情之前,请快速了解一下为什么“使用命名空间标准;” 被认为是不好的做法?. 尽早学习好习惯比以后改掉坏习惯要容易得多。

标准::向量

std::vector允许您将任意数量的对象添加到您的集合中,并且内存管理会自动处理。在您的情况下,您可以要求MaxSizeA然后MaxSizeB循环,直到用户为每个提供了许多有效元素。举个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(),没有理由在此处使用全局变量(事实上,除非绝对必要,否则应避免使用它们)。您在调用后提示MaxSizeA验证流状态,std::cin以确保您在MaxSizeA. 然后您只需循环,直到A.size() == MaxSizeA确保您的用户提供了MaxSizeA有效的整数输入。您可以通过重置流状态来处理失败的输入,然后使用std::cin.ignore(). 不需要计数器,您可以简单地使用A.size()B.size()确定每个向量中存储的当前元素数。

(您还可以检查std::cin.eof()std::cin.bad()捕获用户手动生成EOF或捕获不可恢复的流错误——这留给您。)

您可以使用基于范围的 for 循环(C++11 起)输出每个向量的内容,例如

    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{}, 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');
        }
    }

    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';

}

示例使用/输出

运行程序并故意提供错误输入来练习您可以执行的错误处理:

$ ./bin/arrayVLAtoVector
How Many Values Do You Wish To Enter For A: 4
Enter Values For A[0]: 10
Enter Values For A[1]: 20
Enter Values For A[2]: thirty
  error: invalid integer input.
Enter Values For A[2]: 30
Enter Values For A[3]: 40

How Many Values Do You Wish To Enter For B: 3
Enter Values For B[0]: 1
Enter Values For B[1]: 2
Enter Values For B[2]: buckle my shoe
  error: invalid integer input.
Enter Values For B[2]: 3

array A:
10
20
30
40

array B:
1
2
3

如果您还有其他问题,请仔细查看并告诉我。

于 2020-09-08T04:16:26.623 回答