我有一项任务,我必须创建3个数组。前两个数组具有相似的元素,第三个数组为空。
const int arraySize = 4;
array k[arraySize] = {1, 2 ,3, 7}
array j[arraySize] = { 1, 2, 8, 9}
array u;
int *ptr1 = arrayk;
int *ptr2 = arrayj;
我如何比较前两个元素,然后将这些重复项复制到第三个空数组(数组u
)?
我在想这样的事情:
for(int i = 0; i < arraySize; ++1) {
for(int k = 0; k < arraySize; ++k) {
if(&ptr1[i] == &ptr2[k]) {
//copy elements that are duplicates to array u
}
}
}
答案 0 :(得分:1)
如果您可以使用STL,我建议set_intersection
。以下是此链接中使用的示例:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main () {
int first[] = {5,10,15,20,25};
int second[] = {50,40,30,20,10};
vector<int> v(10); // 0 0 0 0 0 0 0 0 0 0
vector<int>::iterator it;
sort (first,first+5); // 5 10 15 20 25
sort (second,second+5); // 10 20 30 40 50
it=set_intersection (first, first+5, second, second+5, v.begin());
// 10 20 0 0 0 0 0 0 0 0
cout << "intersection has " << int(it - v.begin()) << " elements.\n";
return 0;
}
如果您不能使用STL,请考虑此代码(也来自链接)。
此功能模板的行为等同于:
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result ) { while (first1!=last1 && first2!=last2) { if (*first1<*first2) ++first1; else if (*first2<*first1) ++first2; else { *result++ = *first1++; first2++; } } return result; }
答案 1 :(得分:0)
因为它看起来像家庭作业,我假设你想要自己做,而不是通过使用图书馆来实现这一点。在这种情况下,您的代码很好,您只需要保留一个整数变量来存储u数组中的下一个可用位置。
const int arraySize = 4;
int next = 0;
array k[arraySize] = {1, 2 ,3, 7};
array j[arraySize] = { 1, 2, 8, 9};
array u[arraySize]; // Because it at most be a copy of array k or j
for(int i = 0; i < arraySize; ++i) {
for(int k = 0; k < arraySize; ++k) {
if(arrayk[i] == arrayj[k]) {
u[next++] = arrayk[i];
}
}
}
这样,当您找到重复项时,将其分配给u上的下一个可用位置,然后将next的值增加1。
这是指针版本,虽然我强烈建议在这种情况下避免使用它们,并且仅在需要时才使用它们。
const int arraySize = 4;
int next = 0;
array k[arraySize] = {1, 2 ,3, 7};
array j[arraySize] = { 1, 2, 8, 9};
array u[arraySize]; // Because it at most be a copy of array k or j
int *ptr1 = arrayk;
int *ptr2 = arrayj;
for(int i = 0; i < arraySize; ++i) {
for(int k = 0; k < arraySize; ++k) {
if(*(ptr1 + i) == *(ptr2 + k) {
u[next++] = *(ptr1 + i);
}
}
}