64,680
社区成员
发帖
与我相关
我的任务
分享
#include<vector>
#include<iostream>
#include<functional>
using namespace std;
typedef unsigned int uint;
typedef unsigned long ulong;
void Method1(vector<vector<float>> vParam, vector<unsigned int> bases);
void Method2(vector< vector<float>> vParam, vector<unsigned int> bases);
int main() {
vector<vector<float>> vParam = {
{ 0, 10, 20, 30 },
{ 100, 110 },
{ 200, 210, 220, 230, 240 }
};
// 统计各位的进制
vector<uint> bases;
cout << "各位的进制:";
for (auto fvec : vParam) {
bases.push_back(fvec.size());
cout << fvec.size() << " ";
}
cout << endl << endl;
// 方法一
Method1(vParam, bases);
// 方法二
Method2(vParam, bases);
system("pause");
return 0;
}
void Method1(vector<vector<float>> vParam, vector<uint> bases) {
uint nDigits = bases.size();
// 所有样本数,别超ulong范围就行
ulong nSamples = 1;
for (uint id = 0; id < nDigits; id++)
nSamples *= bases[id];
vector<uint> indices(nDigits, 0);
cout << "方法一" << endl;
for (ulong is = 0; is < nSamples; is++) {
auto sample = is;
// 提取sample中每个数位
for (uint id = 0; id < nDigits; id++) {
// 获得最低位即为一个下标
uint digit = sample % bases[id];
// 去掉最低位
sample /= bases[id];
// 下标放在列表中
indices[id] = digit;
}
// 打印该组合
for (uint id = 0; id < nDigits; id++)
cout << indices[id] << "\t";
cout << "\t";
for (uint id = 0; id < nDigits; id++)
cout << vParam[id][indices[id]] << "\t";
cout << endl;
}
cout << "共有" << nSamples << "种组合" << endl << endl;
}
void Method2(vector<vector<float>> vParam, vector<uint> bases) {
uint nDigits = bases.size();
vector<uint> indices(nDigits, 0);
cout << "方法二" << endl;
// IncDigit()用来给变进制数indices的任意数位加1
// 未加满时返回true,加满后返回false
function<bool(int)> IncDigit;
IncDigit = [&](int idigit) {
if (idigit >= nDigits)
return false; // 加满了
if (indices[idigit] + 1 >= bases[idigit]) {
// 进位
indices[idigit] = 0;
return IncDigit(idigit + 1);
}
else {
// 不进位
indices[idigit] ++;
}
return true;
};
ulong counter = 0; // 如果counter会超出ulong范围,就不要计数了
do {
counter++;
// 打印该组合
for (uint id = 0; id < nDigits; id++)
cout << indices[id] << "\t";
cout << "\t";
for (uint id = 0; id < nDigits; id++)
cout << vParam[id][indices[id]] << "\t";
cout << endl;
} while (IncDigit(0)); // 在整数的最低位不停+1就得到所有组合了
cout << "共有" << counter << "种组合" << endl << endl;
}
for(vector<vector<int> >::iterator it = arr.begin(); it != arr.end(); ++it)
{
for(vector<int>::iterator iter = it->begin(); iter != it->end(); ++iter)
cout << *iter << "\t";
cout << endl;
}
for (auto it = arr.begin(); it != arr.end(); ++it)
{
for (auto iter = it->begin(); iter != it->end(); ++iter)
cout << *iter << "\t";
cout << endl;
}
#include<algorithm>
for (auto it = arr.begin(); it != arr.end(); ++it)
{
for_each(it->begin(), it->end(), [](int n){cout << n << "\t"; });
cout << endl;
}