如何枚举C ++中的元素?

时间:2015-09-22 13:27:32

标签: c++ vector

我的矢量中有1484个数值我想计算每个数量的数量。数量从1到8。 我试过这样的

#include <iostream>
#include <iterator>
#include <fstream>
#include <vector>

using namespace std;

int main(){
vector<int> res;
int sum1,sum2,sum3,sum4,sum5,sum6,sum7,sum8;

std::ifstream inputFile1("/home/milenko/cl.dat");

if (inputFile1) {        
    int value;
    while ( inputFile1 >> value ) {
        res.push_back(value);
    }
}

switch (res) {
case 1:
sum1=sum1+1
  break;
case 2:
sum2=sum2+1
  break;
case 3:
sum3=sum3+1
  break;
case 4:
sum4=sum4+1
  break;
case 5:
sum5=sum5+1
  break;
case 6:
sum6=sum6+1
  break;
case 7:
sum7=sum7+1
  break;
case 8:
sum8=sum8+1
  break;
}

}

但是

error: switch quantity not an integer
 switch (res) {

我该如何解决这个问题?使用循环,还是有其他解决方案?

3 个答案:

答案 0 :(得分:5)

您可以使用std::map<int, int>std::unordered_map<int, int>

轻松完成此操作
std::map<int, int> counter;
for (auto i: res)
  counter[i]++;

要查看每个值的数量:

for (auto p: counter)
  std::cout << "Value: " << p.first 
            << ", occurrences: " << p.second << std::endl;

请注意,这是一个非常通用的解决方案,适用于任意数量的int值,但有一些开销。如果您知道有一组固定的可接受值,则可以使用数组和简单,完美的散列函数。如果这些数字是连续的,那么你的完美哈希函数&#34;只是减去一个偏移量(在你的情况下为1),如@ yvesdaoust的回答所示。

std::array<int, 8> counter{}; // Only 8 values, in range [1, 8]

inline int perf_hash(int n) { return n - 1; }

// WARNING: This will invoke undefined behaviour for i not in range [1,8]
for (auto i: res)
  counter[perf_hash(i)]++;

答案 1 :(得分:2)

最简单的方法是x是您想要计算的数字,

int quantity = std::count(res.begin(), res.end(), x);

我写的方式也适用于其他容器类型,而不仅仅是std::vector

C ++标准库充满了这些强大的功能;我建议你研究一下。

答案 2 :(得分:2)

古老,高效,轻便,遗忘的方式:

team name
team photo
   team member 1 name
   team member 1 photo
   team member 1 qualification/skills
   team member 2 name
   team member 2 photo
   team member 2 qualification/skills
   etc...