假设我们有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);
在您给出的示例代码中,您需要分别检查每对(P1
、P2
等((例如if (P1.first == 1 || P1.second == 1 || P2.first == 1 || <etc> )
(。
如果你坚持要P1
。。。P4
作为不同的变量,在这方面没有捷径,因为您已经定义了P1
、P2
。。。CCD_ 8之间没有逻辑或结构关系。(例如,无法保证它们在机器内存中的位置——它们可能在一起,也可能在完全不相关的内存位置(。
但是有多个具有顺序名称的变量,如P1
、P2
。。。。。表示需要使用原始数组(例如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::array
、std::vector
还是标准库中的任何其他容器,上述用于计算has_one
的值的方法都是相同的。