如何获得两个向量A-B的差

问题描述

如何使用向量A和向量B在C ++中找到集合之间的差异。我弄清楚了Union和Intersection,但是由于某种原因,无论我如何尝试,都无法获得差异。任何帮助将不胜感激(顺便说一句,我需要不使用内置方法手动完成此操作。)

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <fstream>
#include <algorithm>

using namespace std;

void Difference();

int main()
{
    Difference();

    return 0;
}


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

解决方法

if (A[i] != B[j])
{
    int temp = A[i];
    D.push_back(temp);
}

您应该意识到,对于A[i]每个单个元素D不等于B的向量A[i]中将B添加到向量A 。因此,除非D仅包含相同的元素,否则{3,4,9} - {1,3}中的所有内容都将传递到3中。更详细地,操作1将:

  • 添加一次4(因为它不等于1);
  • 添加两次3(因为它既不等于9也不等于1);和
  • 两次添加3(因为它既不等于{3,9}也不等于3)。

因此,在重复删除后,尽管// For each element in A. for(size_t i = 0; i < A.size(); i++) { // Start by assuming not in B,then check every B. bool contains = false; for (size_t j = 0; j < B.size(); j++) { // If found in B,exit early and save that fact. if (A[i] == B[j]) { contains = true; break; } } // If it was not found in B,add it to D. if (! contains) { int temp = A[i]; D.push_back(temp); } } 在两个向量中,您都将得到{1,2,3,3}


您需要做的是检查 any 元素是否匹配,而不是像当前代码那样匹配 every 元素。这可以通过以下循环来完成:

{3}

那样,您也不必担心重复删除,除非原始向量中存在重复。如果是这种情况,您可能需要在原始算法(以及该算法)中提供更多智能,以处理(例如){1,2}{1,3}之间的差异。换句话说,应该是qcut()还是data[(len(data)*index / bin]

,
#include <algorithm>
#include <iostream>
#include <vector>

void sort_and_unique(std::vector<int> &vec) {
  std::sort(vec.begin(),vec.end());
  vec.erase(std::unique(vec.begin(),vec.end()),vec.end());
}

std::vector<int> difference(std::vector<int> a,std::vector<int> b) {
  sort_and_unique(a);
  sort_and_unique(b);
  std::vector<int> res;
  size_t left = 0,right = 0;
  while (left < a.size() && right < b.size()) {
    if (a[left] < b[right]) {
      res.emplace_back(a[left++]);
    } else if (a[left] == b[right]) {
      left++;
      right++;
    } else {
      right++;
    }
  }
  while (left < a.size()) {
    res.emplace_back(a[left++]);
  }
  return res;
}

int main() {
  std::vector<int> A{3,9,12,13,15};
  std::vector<int> B{1,5,7,9};
  std::vector<int> res = difference(A,B);
  for (int x : res) {
    std::cout << x << ' ';
  }
  std::cout << std::endl;
  return 0;
}

这是一个O(nlogn)方法,它也删除重复的元素。关键是要利用订购。使用两指针方法可以帮助实现这一目标。

如果输入可靠(每个元素在其向量中都是唯一的),则可以省略vec.erase行。