如何将矢量与数组进行比较?

时间:2015-06-17 05:40:12

标签: c++ arrays vector compare containers

我想将vector与数组进行比较。向量和数组中的元素顺序不同,未排序且可以重复。例如。

以下是相同的:

vector<int> lvector = {5,7,3,1,2,7};
int larray[6] = {3,5,1,7,2,7}

下面,不一样:

vector<int> lvector = {5,7,3,1,2,7,5};
int larray[7] = {3,5,1,7,2,7,3}

这样的事情也不一样:

vector<int> lvector = {1,1,1,1,2,2};
int larray[6] = {1,1,1,1,1,2}

现在我需要检查矢量和数组是否具有相同的元素。我无法修改向量和数组,但我可以创建一个新容器并将元素从向量和数组复制到这个新容器,然后复制它们。我问这个,因为我想以有效的方式做到这一点。感谢。

3 个答案:

答案 0 :(得分:2)

解决这个问题有很多不同的方法,每个方法都有处理和缺点。

一些预测试

  1. 显然,如果它们的大小不同,则两个范围不能相等。
  2. 你可以为范围内的元素计算一个顺序无关的哈希函数(谢谢,@迈克尔安德森)。它可以是一个元素的总和,或者你可以xor它们全部。具有不同哈希值的数组不能相等。
  3. std::unordered_multiset

    您可以创建unordered_multiset,其中包含范围内元素的频率。虽然它具有平均线性复杂度,但由于散列冲突,它可能是O(n ^ 2)。引自标准(N3337,§23.5.7.2):

      

    复杂性:平均情况线性,最坏情况二次。

    但是,您还应该记住std::unordered_set::operator==的复杂性:

      

    对于unordered_setunordered_map,复杂性   operator==(即,对==运营商的呼叫数量   value_typekey_equal()返回的谓词,以及hash_function()   由N返回的哈希与N^2中的N成正比   平均情况和最差情况下的a.size() unordered_multisetunordered_multimap

         

    对于operator==sum of Ei^2,复杂性   N^2在平均情况下与N成正比   在最糟糕的情况下a.size() EiiaEai   Ebia等效键组的大小。

         

    然而,如果   每对应的等效密钥对应的各个元素   群组bunordered_multiset按相同顺序排列(通常情况下)   例如,unordered_multimapN是未经修改的副本   容器),然后O(N2)的平均情况复杂度   并且#include <iostream> #include <unordered_set> #include <vector> int main() { std::vector<int> v{5, 7, 3, 1, 2, 7}; int arr[] = {3, 5, 1, 7, 2, 7}; std::unordered_multiset<int> mv(std::begin(v), std::end(v)); std::unordered_multiset<int> ma(std::begin(arr), std::end(arr)); std::cout << "Are equal? " << (mv == ma) << std::endl; return 0; } O(n * log(n))成比例(但最坏情况   复杂性仍为#include <iostream> #include <algorithm> #include <vector> int main() { std::vector<int> v{5, 7, 3, 1, 2, 7}; int arr[] = {3, 5, 1, 7, 2, 7}; std::vector<int> sv(v); std::vector<int> sa(std::begin(arr), std::end(arr)); std::sort(std::begin(sv), std::end(sv)); std::sort(std::begin(sa), std::end(sa)); std::cout << "Are equal? " << (sv == sa) << std::endl; return 0; } ,例如,对于病态错误的哈希   功能)。

    示例:

    .line1 div {
        width: 100px;
        height: 100px;
        background: red;
        transition: width 2s;
        margin:10px;
    }
    .line1 div:hover {
        width:400px;
    }
    

    std::sort

    您可以比较范围的已排序副本。根据标准(N3337,§25.4.1.1),它具有var userList = { "active": activeUsersId, "inactive": inactiveUsersId } $.ajax({ type: "POST", data: userList, url: "/ewaanmapbuilder/rest/user/status", contentType: "application/json", success: function (flag) { if (flag == true) { $("#messageContainer").text("Status Updated Successfully!"); } else { $("#messageContainer").text("Status Updation Failed!"); } $('#messageContainer').css('display', 'block'); setTimeout(function () { $('#messageContainer').css('display', 'none'); $('.registration-container').css('margin-top', '10%') }, 3000); } }); 复杂性:

      

    复杂性:O(N log(N))(其中N == last-first)比较。

    示例:

    @ResponseBody
    @RequestMapping(value = EwaanMapBuilderConstant.UPDATE_USER_STATUS, method = RequestMethod.POST,consumes= MediaType.APPLICATION_JSON_VALUE)
    public boolean updateUserStatus(@RequestBody ActiveUserList userList, HttpServletRequest request) {     
        try {
            HttpSession session = request.getSession();
            String adminUserId = session.getAttribute(EwaanMapBuilderConstant.USER_ID).toString();
            userService.updateUserStatus(userList, adminUserId);
        }
        catch(Exception e) {
            logger.error("update status failed" +e);
            return false;
        }
        return true;
    }
    

答案 1 :(得分:2)

这是很快提出的建议的变体:

#include <iostream>
#include <unordered_set>
#include <vector>


int main()
{
    std::vector<int> v{5, 7, 3, 1, 2, 7};
    int arr[] = {3, 5, 1, 7, 2, 7};

    std::vector<int> mv(std::begin(v), std::end(v));
    std::vector<int> ma(std::begin(arr), std::end(arr));
    std::sort(mv.begin(), mv.end()) ;
    std::sort(ma.begin(), ma.end()) ;

    std::cout << "Are equal? " << (mv == ma) << std::endl;
    return 0;
}

答案 2 :(得分:0)

首先将数组转换为v1向量。

V = {1,1,2,3,4};矢量和

V1 = {1,1,2,3,4};从数组转换

angular.module("ctrl", [])
    .controller("appsctrl", function ($scope) {
      $scope.data = {
        frontend: [{ id: 1, name: 'css' }, { id: 2, name: 'jquery' }, { id: 3, name: 'html' }, { id: 4, name: 'angularjs' }],
        Server: [{ id: 1, name: 'php' }, { id: 2, name: 'ruby' }, { id: 3, name: 'c#' }, { id: 4, name: 'python' }]
      };

      $scope.selectvalues = function () {
        angular.forEach($scope.data, function (value, key) {
          $scope.values = value;
        });
      }

    });