如何直接检查一组配对是否有通信号码



假设我们有4对,例如

pair<int, int> P1(1, 2);
pair<int, int> P2(3, 1);
pair<int, int> P3(2, 1);
pair<int, int> P4(1, 5);

我如何直接比较这4对,并得出它们都有共同的数字1的结论?我只能想一对一对地比较,但这对很多情侣来说都是一项艰巨的工作。。。

对于任何一组给定的配对,有没有函数可以做到这一点?

没有助手"内置的";检查所有对是否都包含某个数字,但这是一个相当容易的操作!

为此,您需要一个接收对列表的函数。

bool allPairsShareNumber(list<pair<int, int>> pairs, int number) {
return all_of(pairs.begin(), pairs.end(), [&number](pair<int,int> pair){
return pair.first == number || pair.second == number;
});
}

然后您可以将列表传递给函数!

pair<int, int> P1(1, 2);
pair<int, int> P2(3, 1);
pair<int, int> P3(2, 1);
pair<int, int> P4(1, 5);
list<pair<int, int>> pairList = { P1, P2, P3, P4 };
bool doTheyAllContain1 = allPairsShareNumber(pairList, 1);

在您给出的示例代码中,您需要分别检查每对(P1P2等((例如if (P1.first == 1 || P1.second == 1 || P2.first == 1 || <etc> )(。

如果你坚持要P1。。。P4作为不同的变量,在这方面没有捷径,因为您已经定义了P1P2。。。CCD_ 8之间没有逻辑或结构关系。(例如,无法保证它们在机器内存中的位置——它们可能在一起,也可能在完全不相关的内存位置(。

但是有多个具有顺序名称的变量,如P1P2。。。。。表示需要使用原始数组(例如pair<int, int> P[4](或标准容器(例如vector<pair<int, int> > P(。如果您使用原始数组或标准容器来构建代码,那么就有一些选项。例如,原始数组;

std::pair<int, int> P[4];
//  set the four elements of P
bool has_one = false;
for (int i = 0; has_one == false && i < 4; ++i)
if (P[i].first == 1 || P[i].second == 1) has_one = true;

只要在编译时数量是固定的,它就可以容易地扩展到任意数量的对。请记住,数组索引从零开始,而不是从一开始(即P[0]存在于上述中,但P[4]不存在(。

这种代码的危险在于没有正确更新数字(例如,将P的元素数量从4更改为27,但忘记在循环中进行相同的更改(。

与原始数组不同,一个更好的选择是使用标准容器——尤其是如果您想对这组对执行多项操作的话。如果在编译时对的数量是固定的,则可以将上述P的定义更改为使用array标准容器。

std::array<std::pair<int, int>, 4> P;      // array is from standard header <array>
//  assign the four elements of P (code omitted)

与使用原始阵列相比,其提供了许多优点。

如果在编译时对的数量未知(例如,数量是根据运行时读取的值计算的(,则可以使用另一个标准容器,如

// compute n as the number of elements
std::vector<std::pair<int, int> > P (n);

在所有情况下,原始数组(注意避免检查比数组多的元素等问题(和标准容器都可以在循环中使用。

然而,在可能的情况下,避免使用循环,而是使用C++标准库提供的算法,这被认为是更好的(因为它不太容易出错(。例如(C++11及更高版本(,您可以执行

#include <algorithm>
#include <vector>
int main()
{
// compute n as the number of elements  (code omitted)
std::vector<std::pair<int, int>> P(n);
// populate elements of P  (code omitted)
auto check_if_one = [](std::pair<int, int> a)
{return a.first == 1 || a.second == 1;};
bool has_one = (std::find_if(std::begin(P), std::end(P), check_if_one) != std::end(P));
}

这样做的优点是代码总是正确地说明P中的元素数量。无论P是原始数组、std::arraystd::vector还是标准库中的任何其他容器,上述用于计算has_one的值的方法都是相同的。

相关内容

  • 没有找到相关文章

最新更新