gpt4 book ai didi

c++ - 使用比较运算符比较数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:27:51 24 4
gpt4 key购买 nike

这只是一个小问题,更多的是为了理解数组的用法,而不是解决一个难题。

我目前有一个包含四个整数(邻居)的数组,我想将其与一组其他数组(这些数组在其他任何地方都不存在——我不需要存储它们)进行比较。我想知道 Neighbors 四个数组中的哪一个是相同的。作为一个一无所知的人,我的第一次尝试是这样做:

if (Neighbors == {1, 1, 0, 0})
{
//code...
}
else if (Neighbors == {0, 1, 1, 0})
{
//code...
}
else if (Neighbors == {0, 0, 1, 1})
{
//code...
}
else if (Neighbors == {1, 0, 0, 1})
{
//code...
}

如您所见,整数的顺序很重要。但是,上面返回的编译器错误是关于在大括号标记之前期望主表达式。

因此,我尝试了这个:

int Sets[4][4] = { {1, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 1} };
if (Neighbors == Sets[0])
{
//code...
}
else if (Neighbors == Sets[1])
{
//code...
}
else if (Neighbors == Sets[2])
{
//code...
}
else if (Neighbors == Sets[3])
{
//code...
}

这里发生的是,即使 Neighbors = {0, 1, 1, 0}(例如),Neighbors == Sets[1] 也会返回 false。

现在,在这样做并想知道为什么之后,我想起了数组变量基本上是指向序列中第一个元素的指针。正确的?所以我想我明白为什么上面的代码不起作用——我比较的是两个内存地址,而不是两个数组。所以我写了这段代码,效果很好:

    for (int ii = 0; ii < 4; ++ii)
{
bool Same = true;
for (int jj = 0; jj < 4; ++jj)
{
if (Neighbors[jj] != Set[ii][jj])
{
Same = false;
}
}

if (Same == true)
{
//code...
}
}

我想知道是否有一种方法可以像这样比较数组而无需经过两个 for 循环。看起来应该比这更简单。我知道当您只有 4 个值时,for 循环并不是特别密集,但我仍然认为确定两个数组是否包含相同信息会更容易。如果每个数组都是一个连续的内存块,我认为您可以只查看这两个 block 并检查它们是否相同(这基本上就是 for 循环所做的,尽管这需要手动执行)。

那么有没有办法直接比较数组的内容,最好是用一行代码呢?如果不是,为什么不呢?我想了解这个问题背后的科学。

最佳答案

您已将问题标记为 C++。这意味着您应该使用 std::vector。它重载了operator==这就是你想要的(对于两个 vector )。

您还可以使用 std::equalstd::lexicographical_compare对于任何你有迭代器的东西,包括原始数组。

当然你也可以为其他事情重载operator==。不幸的是,您不能为原始数组重载它,因为仅当至少一个参数是类(或结构)类型时才允许重载运算符。但是您可以覆盖它以将 vector 与数组进行比较。像这样的东西:

template<typename T, typename Alloc, size_t S>
bool operator==(std::vector<T, Alloc> v, const T (&a)[S])
{
return v.size() == S && std::equal(v.begin(), v.end(), a);
}

(这引用了未降级为指针的数组,以首先检查其声明的大小,因此是安全的)

当然所有这些方法内部都隐藏了一个循环,一个一个地比较元素。但您不必编写它。

关于c++ - 使用比较运算符比较数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11305718/

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