[英]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.