c++ 如何检查两个数组或列表是否相同?

im9ewurl  于 2023-05-08  发布在  其他
关注(0)|答案(3)|浏览(349)

在Python中,可以很容易地判断arr1是否与arr2相同,例如:

[1,2,3] == [1,2,3]
{1,2,3} == {3,1,2}
(1,2,3) == (1,2,3)

在C++中如何做到这一点?

//#include <bits/stdc++.h>
using namespace std;
int main()
{
//    if ({1, 2}== {1, 2})
//        cout<<" {1, 2}== {1, 2}";
    if ((1, 2)== (2, 2))
        cout<<" (1, 2)== (1, 2) equal";
}

if ({1, 2}== {1, 2}) cout<<" {1, 2}== {1, 2}";抛出错误error: expected primary-expression before ‘{’ token,然而,if ((1, 2)== (2, 2)) cout<<" (1, 2)== (1, 2) equal";给出了意外的结果,它认为(1,2)和(2,2)是相同的。
我是否必须将列表转换为向量,在C++中进行比较,如下图所示?

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    if (vector<int>({1, 2})== vector<int>({1, 2}))
        cout<<" vector<int>({1, 2})== vector<int>({1, 2}";

}

C++中的(1,2){1,2}的数据类型是什么?

vh0rcniy

vh0rcniy1#

C中的(1,2)和{1,2}的数据类型是什么?
(1,2)uses the comma operator的表达式。这个表达式的类型是int
{1,2}本书是对C
阴暗部分的一次冒险。这个构造本身在语法上是一个braced initialization list,它本身不是任何形式的类型。每当人们想要使用转发引用的服务时,这总是会产生一堆悲伤的面孔,因为花括号初始化列表不是正式的类型,并且不能被压缩到转发引用中。
但并非所有的希望都破灭了。当在这里显示的上下文中使用时,在太多时间过去之前,这个构造很快就变成了std::initializer_list,这是一个非常真实的类型。然后,在所示的代码中,它被传递给std::vector的重载构造函数,该构造函数接受std::initializer_list作为其参数。

xpcnnkqh

xpcnnkqh2#

在Python中,可以很容易地判断arr 1是否与arr 2相同,例如:

[1,2,3] == [1,2,3]

在Python中,方括号足以表示一个列表。在C++中,这是一种静态类型语言,你不能这样做。你必须使用它们的类型来声明数组:

int arr1[] = {1, 2, 3};
int arr2[] = {1, 2, 3};

正如在其他答案中所解释的,{1, 2, 3}本身是一个花括号初始化列表,而不是一个数组。在C++中,数组没有值语义。你不能像使用==比较两个整数那样比较它们。相反,您必须使用标准库中的函数(如std::equal)来比较两者:

std::equal(std::begin(arr1), std::end(arr1), std::begin(arr2), std::end(arr2))

其在内部逐个比较两个向量中的每个元素。当然,这比Python更冗长,但Python在做同样的事情。
或者,您可以使用STL容器,如std::vectorstd::array,它们具有运算符==:

std::vector<int>{1,2,3} == std::vector<int>{1,2,3};
std::array<int, 3>{1,2,3} == std::array<int, 3>{1,2,3}

std::vectorstd::array之间的区别在于后者是固定大小的数组,而前者是可变的。
对于套件:
{1,2,3} == {3,1,2}
元组:
(1,2,3)==(1,2,3)
你可以像这样使用==操作符:

std::set<int>{ 1, 2, 3 } == std::set<int>{3, 1, 2}
std::make_tuple( 1, 2, 3 ) == std::make_tuple(3, 1, 2)

但是你必须首先显式地创建集合和元组,这与Python不同,Python从括号中推断出你想要创建的内容。
Demo

7cjasjjr

7cjasjjr3#

C++中的(1,2)和{1,2}的数据类型是什么?*
{1,2}是一个初始化列表,你不能在这样的比较中使用它,但你可以赋值,* 即 *:

std::initializer_list<int> init = {1, 2};

你可以使用迭代器访问数据,init.begin()会给予你一个指向第一个元素的 * 指针 *,你可以从那里继续,如果你指定一个类型,它会给你更多的功能,例如:

std::vector a = {1, 2};

这里有一个向量int,其中包含两个元素12
(1, 2) == (2, 2)实际上什么都不是,逗号左边的元素将被丢弃,就好像你有2 == 2一样。

  • 我是否必须将列表转换为向量,在C++中进行比较,如下图所示?*

AFAICT,是的,必须涉及一个类型才能进行适当的比较。
如果你必须使用数组,并且你确定数组将具有相同数量的元素,你可以使用is_permutation来Assert数组是否具有相同的元素以不同的顺序:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    
    std::vector<int> v1 {1, 2, 3};
    std::vector<int> v2 {3, 1, 2};

    if(std::is_permutation(v1.begin(), v1.end(), v2.begin())){
      std::cout << "v1 == v2";
    }   
}

或者,您可以使用std::sort然后执行比较,前提是您使用STL容器,如std::vectorstd::array,其==运算符存在重载。
如果你可以使用其他类型的集合,我的建议是使用std::set,它将比较true,无论插入的顺序是什么:

#include <iostream>
#include <set>

int main() {
    
    std::set<int> s1 {1, 2, 3};
    std::set<int> s2 {3, 1, 2};

    if(s1 == s2){
      std::cout << "s1 == s2";
    }   
}

您可以访问完整的容器库及其详细信息here,然后您可以选择更适合您需求的容器库。

相关问题