如何在 C++ 中获取 std:vectors 的频率?

How to get frequency of std:vectors in C++?

我有 5 个向量。我想检查这些向量存在多少次。我使用以下代码比较 2 个向量是否相等,但现在我有 2 个以上的向量。我想将所有这 5 个向量一起比较并计算每个向量存在的次数。

我该怎么做?

输出应该是:

(0,0,1,2,3,0,0,0) = 2 time(s)

(0,0,1,2,3,4,0,0) = 1 time(s)

(0,0,2,4,3,0,0,0) = 1 time(s)

(0,0,6,2,3,5,6,0) = 1 time(s)

这是我的代码:

#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;

void checkVec(vector<int> v){
   vector<int> v0;
   if(v0 == v){
      cout << "Equal\n";
   }
   else{
      cout << "Not Equal\n";
   }
}

int main(){
    vector<int> v1={0,0,1,2,3,0,0,0};
    vector<int> v2={0,0,1,2,3,4,0,0};
    vector<int> v3={0,0,2,4,3,0,0,0};
    vector<int> v4={0,0,1,2,3,0,0,0};
    vector<int> v5={0,0,6,2,3,5,6,0};

    checkVec(v1);
    return 0;
}

您可以使用std::map计算每个向量出现的次数:

#include <map>
#include <vector>
#include <iostream>
using vec = std::vector<int>;

int main(){
    vec v1={0,0,1,2,3,0,0,0};
    vec v2={0,0,1,2,3,4,0,0};
    vec v3={0,0,2,4,3,0,0,0};
    vec v4={0,0,1,2,3,0,0,0};
    vec v5={0,0,6,2,3,5,6,0};


    std::map<vec,std::size_t> counter;
    // Initializer list creates copies by default
    // But you should not create vX variables anyway.
    for(const auto& v: {v1,v2,v3,v4,v5}){
        ++counter[v];
    }

    std::cout<<"V1 is present " <<counter[v1]<<" times.\n";

    return 0;
}
V1 is present 2 times.

好吧,这是对 Quimby 回答的贡献,但如果您知道在编译时将获得多少向量,请使用 std::array 来包含所有该向量。如果您在运行时知道它,请使用 std::vector,如下所示

#include <map>
#include <vector>
#include <iostream>
#include <cstddef>

int main(){

    std::vector<std::vector<int>> allVector
    {
         std::vector<int>{0,0,1,2,3,0,0,0},
         std::vector<int>{0,0,1,2,3,4,0,0},
         std::vector<int>{0,0,2,4,3,0,0,0},
         std::vector<int>{0,0,1,2,3,0,0,0},
         std::vector<int>{0,0,6,2,3,5,6,0},
    };


    std::map<std::vector<int>, std::size_t> counter;

    for(const auto& v : allVector)
    {
          ++counter[v];
    }
    // print out the array and it's frequency
    for(const auto& pr : counter)
    {
            std::cout << '(';
            for(std::size_t i {0}; i < pr.first.size(); ++i)
            {
                std::cout << pr.first[i];
                if(i != pr.first.size() - 1)
                    std::cout << ' ';
            }
            std::cout << ") = " << pr.second << ", ";

    }

    return 0;
}