2个动态分配数组c++的交集
Intersection of 2 dynamically allocated arrays c++
我正在尝试创建一个函数,该函数将查找比较数组1和数组2的两个动态分配数组的交集。对于数组1中不在数组2中的任何值,应该在数组1中删除这些值,以便数组1现在只保存两个数组的公共值(没有重复)。我不能在类中使用向量、哈希或任何其他当前函数之外的东西:
这是我到目前为止的代码:
bool IntSet::contains(int val) const
{
for (int i = 0; i < numValues; i++)
{
if (set[i] == val)
return true;
}
return false;
}
此函数将整数参数与当前存储在数组中的值进行比较。。。如果数组中有一个值,则返回true,否则返回false;
下一个函数接收一个值并从数组中删除该值:
void IntSet::remove(int val)
{
for (int i = 0; i < numValues; i++)
{
if (set[i] == val)
for (int j = 0; j < numValues; j++)
set[j] = set[j + 1];
}
numValues--;
}
这就是我遇到的问题,下一个函数应该遍历一个数组,并将这些值与另一个数组中的值进行比较。。。如果一个数组中的一个值在另一个数组,它应该跳过它,但如果一个值不在调用函数的数组中,它应该从调用数组中删除该值:
void IntSet::removeDifferent(const IntSet &set2)
{
for (int i = 0; i < set2.size(); i++)
{
if (!set2.contains(set[i]))
{
remove(set[i]);
}
}
}
我在removeDifferent()函数上尝试了大约50种不同的变体,但我似乎无法理解这一点。有人能给我指正确的方向吗?
您正在通过set2
的索引迭代i
,但随后您正在测试set[i]
。试试这个:
void IntSet::removeDifferent(const IntSet &set2)
{
for (int i = 0; i < numValues; ) {
if (!set2.contains(set[i])) {
remove(set[i]);
} else {
i++;
}
}
注意,我还从for
循环头中删除了i++
。这是因为当移除一个元素时,下面的所有元素都会下移,所以下一个元素会在数组中占据它的位置。如果递增i
,它将跳过该元素。
您还需要修复remove
。它应该从i
开始它的内部循环,所以它只在移除元素后向下移动元素,并且它应该在numValues-1
停止,所以它在复制set[j+1]
时不会尝试访问数组外部。作为一种优化,一旦找到匹配项,它就可以将break
从外循环中移除(我假设IntSet
不允许重复,因为您只将numValues
递减1)。
void IntSet::remove(int val)
{
for (int i = 0; i < numValues; i++)
{
if (set[i] == val) {
for (int j = i; j < numValues - 1; j++) {
set[j] = set[j + 1];
}
break;
}
}
numValues--;
}
问题出在remove()函数中:
void IntSet::remove(int val)
{
for (int i = 0; i < numValues; i++)
{
if (set[i] == val)
for (int j = 0; j < numValues; j++)
set[j] = set[j + 1];
}
numValues--;
}
你可以在这里用纸和铅笔自己弄清楚为什么这是错误的。从一个典型的例子开始:假设您在五元素数组的第三个元素中找到了要查找的值:
if (set[i] == val)
在这个例子中,i
将被设置为2,而numValues
将被设置成5。val
是什么并不重要。不管它是什么,当i
是2,numValues
是5时,你就会发现它:你在五元素数组的第三个元素中发现了它。记住这一点。
现在,您知道您现在应该移除这个五元素数组中的第三个元素。但你认为接下来会发生什么:
for (int j = 0; j < numValues; j++)
set[j] = set[j + 1];
好吧,使用前面提到的纸和铅笔,如果你计算出来,就会发生以下情况:
- 集合[1]将被复制到集合[0]
- 集合[2]将被复制到集合[1]
- 集合[3]将被复制到集合[2]
- 集合[4]将被复制到集合[3]
- 集合[5]将被复制到集合[4]
这里有两个问题:
A) 没有set[5]
。回想一下,这是一个五元素数组,因为您只有set[0]
到set[4]
B) 您不应该将数组中的所有内容都复制到一个元素中。您必须仅复制要删除的元素之后的元素。
解决这两个问题,你可能会发现一切都会正常工作。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 使用动态分配将 char* 复制到另一个字符**
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 二维阵列的动态分配
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存