gpt4 book ai didi

c++ - 查找 'n' 通用数组的交集

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:07:47 25 4
gpt4 key购买 nike

编辑:添加了更多细节。

我正在尝试编写一种算法来查找 n 个数组的交点(所有点的共同点)。我的程序获取这些数组并将它们存储在一个二维数组中,在该数组中进行操作。例如,这是一个示例主要方法:

int a[] = { 12, 54, 42 };
int b[] = { 54, 3, 42, 7 };
int c[] = { 3, 42, 54, 57, 3 };

IntersectionTableau<int> x(3); // Where 3 is the max number of arrays allowed
// to be stored.
x.addArray(a, 3);
x.addArray(b, 4);
x.addArray(c, 9);
x.run(); // Finds the intersection.

这些添加的数组将存储在 T** 数组 中,它们的大小在 int* sizes 中。 T 是泛型。什么是一种有效的算法,可以让我对可变数量的泛型类型数组执行此操作?

这是我目前正在尝试做的事情:

template <class T>
inline
void IntersectionTableau<T>::run() {
T* commonElements = d_arrays[0];
for (int i = 1; i < d_currentNumberOfArrays; ++i) {
commonElements = getIntersection(commonElements, d_arrays[i], d_sizes[i - 1], d_sizes[i]);
}
d_results = commonElements;
}



template <class T>
inline
T* IntersectionTableau<T>::getIntersection(T* first, T* second, int sizeOfFirst, int sizeOfSecond) {
T* commonElements;
if (sizeOfFirst > sizeOfSecond) {
commonElements = new T[sizeOfFirst];
} else {
commonElements = new T[sizeOfSecond];
}
for (int i = 0; i < sizeOfFirst; ++i) {
for (int j = 0; j < sizeOfSecond; ++j) {
if (first[i] == second[i]) {
commonElements[i] = first[i];
}
}
}
return commonElements;

第一个函数获取前两个数组并将它们发送到第二个函数,第二个函数返回这两个数组之间的交集数组。然后,第一个函数将交集数组与 d_arrays 中的下一个数组进行比较,依此类推。我的问题是,当我从 d_results 打印出一个元素时,产生了一个垃圾值,我不确定为什么。有人可以告诉我我做错了什么,或者有更好的方法来完成这个吗?

最佳答案

代码中至少有两个问题:


if (first[i] == second[i])

这应该是 if (first[i] == second[j]) .


commonElements[i] = first[i];

修复起来比较棘手。我想你想要另一个变量(既不是 i 也不是 j );我们称它为k :

commonElements[k++] = first[i];

无论如何,既然可以使用C++,就可以使用std::vector反而。它在里面存储它的大小;这将减少混淆:

template <class T>
std::vector<T> // note: adjusted the return type!
IntersectionTableau<T>::getIntersection(...)
{
std::vector<T> commonElements;
for (int i = 0; i < sizeOfFirst; ++i) {
for (int j = 0; j < sizeOfSecond; ++j) {
if (first[i] == second[j]) {
commonElements.push_back(first[i]);
}
}
}
return commonElements;
}

你可以转firstsecond也转换为 vector (尽管您现在不会从中受益太多)。

这里有几点需要注意:

  • 我将返回类型更改为 vector<T>
  • 返回数组的旧版本需要额外的代码来指定其结果的长度;此版本返回 vector<T> 内的长度对象
  • 返回数组的旧版本需要 delete[] array稍后的某个地方,以防止内存泄漏
  • vector - 指针黑客攻击 &commonElements[0]不适用于空的 vector

如果您的其他代码使用数组/指针,您可以使用 vector - 指针黑客攻击 &commonElements[0] ,但是函数之外,为了遵守生命周期规则:

T* commonElements = NULL;
for (int whatever = 0; whatever < 10; ++whatever)
{
std::vector<T> elements = xxx.getIntersection(...); // will work
commonElements = &elements[0]; // can pass this pointer to a function receiving T*
print(commonElements); // will work
}
print(commonElements); // cannot possibly work, will probably segfault
print(elements); // cannot possibly work, and compiler will reject this

关于c++ - 查找 'n' 通用数组的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19713020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com