コンテナ内の要素のすべての組み合わせを繰り返し処理できるような一種のイテレータが必要です(繰り返しは許可され、{1,2}=={2,1}
)。 std::map
...私の "choose k from n"アルゴリズムはstd :: vectorでは動作しますが、std :: mapでは動作しないのはなぜですか?
int main(){
//std::vector<std::string> xx = {"A","B","C"};
std::map<int,int> xx;
xx[1] = 1;
xx[2] = 2;
auto kn = createChooseKfromN(xx.begin(),xx.end(),2);
int counter = 0;
do {
for (auto it = kn.begin();it != kn.end();it++){
std::cout << (**it).first << "\t";
}
std::cout << "\n";
counter++;
} while(kn.increment());
std::cout << "counter = " << counter << "\n";
}
でこれを使用して
#include <iostream>
#include <map>
#include <vector>
template <typename T>
struct ChooseKfromN{
T mbegin;
T mend;
std::vector<T> combo;
ChooseKfromN(T first,T last,int k) : mbegin(first),mend(last),combo(k,first) {}
bool increment(){
for (auto it = combo.begin();it!=combo.end();it++){
if (++(*it) == mend){
if (it != combo.end()){
auto next = it;
next++;
auto nexit = (*next);
nexit++;
std::fill(combo.begin(),next,nexit);
}
} else { return true;}
}
std::cout << "THIS IS NEVER REACHED FOR A MAP !! \n" << std::endl;
return false;
}
typename std::vector<T>::const_iterator begin(){ return combo.begin();}
typename std::vector<T>::const_iterator end() { return combo.end();}
};
template <typename T>
ChooseKfromN<T> createChooseKfromN(T first,T last,int k) {
return ChooseKfromN<T>(first,last,k);
}
...私はランタイムエラーを取得する:私はこれを書きました。ベクターで私は正しい出力を取得しますが(もhereを参照してください):それはstd::vector
で動作するとき
A A
B A
C A
B B
C B
C C
THIS IS NEVER REACHED FOR A MAP !!
counter = 6
は、なぜそれがstd::map
のために壊すのか?
たぶん、あなたは見ることができますあなたが 'map'で得たランタイムエラー? – Holt
@Holt実行すると、「これは決して...」の前にすべてが表示され、「ランタイムエラー」としか表示されません。何もない – user463035818
は完璧に動作します - ああ待ってはいけません - BAD_ACCESSでエラーが発生します –