问题描述
如何使用向量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
行。