簡體   English   中英

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

[英]How to enumerate elements in C++?

我的向量中有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) {

我應該如何解決?使用循環,還是有其他解決方案?

您可以使用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值,但有一些開銷。 如果您知道有一組固定的可接受值,則可以使用數組和簡單,完善的哈希函數。 如果這些數字是連續的,那么您的“完美哈希函數”就是一個偏移量的減法(在您的情況下為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)]++;

最簡單的方法(其中x是您要計數的數字)是

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

我寫的方式也可以用於其他容器類型,而不僅僅是std::vector

C ++標准庫充滿了這些強大的功能。 我建議你研究一下。

舊的,高效的,輕巧的,被遺忘的好方法:

int Sum[8]= { 0, 0, 0, 0, 0, 0, 0, 0 };

int Value;
while (inputFile1 >> Value)
    Sum[Value - 1]++;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM