检查向量的所有元素在C++中是否相等

 亲清吻文kiss 发布于 2023-02-13 19:17

如果我有一个值向量并想要检查它们是否完全相同,那么在C++中有效地执行此操作的最佳方法是什么?如果我用R之类的其他语言进行编程,我的思维方式就是只返回容器的唯一元素,然后如果唯一元素的长度大于1,我知道元素不能相同.在C++中,这可以这样做:

//build an int vector
std::sort(myvector.begin(), myvector.end());
std::vector::iterator it;
//Use unique algorithm to get the unique values.
it = std::unique(myvector.begin(), myvector.end());
positions.resize(std::distance(myvector.begin(),it));
if (myvector.size() > 1) {
    std::cout << "All elements are not the same!" << std::endl;
}

然而,阅读有关互联网和SO,我看到其他答案,如使用集合或find_if算法.那么最有效的方法是什么?为什么?我想我的不是最好的方法,因为它涉及排序每个元素然后调整向量的大小 - 但也许我错了.

谢谢,本.

3 个回答
  • 给定矢量没有约束,无论方法如何,都必须至少迭代一次向量.所以只需选择第一个元素并检查所有其他元素是否相等.

    2023-02-13 19:18 回答
  • 你不需要使用std::sort.它可以以更简单的方式完成:

    if ( std::adjacent_find( myvector.begin(), myvector.end(), std::not_equal_to<>() ) == myvector.end() )
    {
        std::cout << "All elements are equal each other" << std::endl;
    }
    

    2023-02-13 19:18 回答
  • 您可以使用 std::equal

    版本1:

    //assuming v has at least 1 element
    if ( std::equal(v.begin() + 1, v.end(), v.begin()) )
    {
        //all equal
    }
    

    这将比较每个元素与前一个元素.

    版本2:

    //assuming v has at least 1 element
    int e = v[0]; //preferably "const auto& e" instead
    bool all_equal = true;
    for(std::size_t i = 1,s = v.size();i<s && all_equal;i++)
        all_equal = e == v[i];
    

    编辑:

    关于性能,在使用100m元素进行测试后,我发现Visual Studio 2015的version 1速度大约是其两倍version 2.这是因为当您使用ints,float等时,vs2015的最新编译器在c ++ std实现中使用sse指令.

    如果您使用_mm_testc_si128,您将获得类似的性能std::equal

    2023-02-13 19:20 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有