std :: map()を使用して2Dテーブルを作成して、1つの数値が別の数値に何回遷移するかを計算しています。私は2つの問題に遭遇しました。まず、私の最初の移行は表示されません(1 - > 2)。第二に、私のすべてのトランジションは1回しか表示されません(2-> 3および3-> 1両方が2回起こります)。C++での2Dイテレータアクセス
遷移が1回だけ起こっているのがわかります。イテレーターはcurrentValを表示せず、elseに行きます。ここで値を加算して終了します。私はこれを修正する方法はわかりません。どんな助けもありがとう!
#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
//import midi notes
vector <int> midiFile = {1, 2, 3, 1, 20, 5, 2, 3, 1};
//create a 2d hashmap for matrix
map <string, map <string, int> > mCounts;
//strings for the previous value and current value
string prevVal = "";
string currentVal = "";
void addNumbers(vector <int> midiFile) {
for (int i = 0; i < midiFile.size(); i++) {
currentVal = to_string(midiFile[i]);
if(prevVal == "") {
prevVal = currentVal; //first value
} else {
//playCounts is temporary map to store counts of current val in relation to previous val
map <string, int> playCounts;
map <string, int> ::iterator iterator;
iterator = playCounts.find(currentVal);
//if mCounts doesn't contain the value yet, create a new hashmap
if(iterator != playCounts.end()){
int counter = iterator -> second;
mCounts[prevVal] [currentVal] = counter + 1;
} else {
playCounts.insert(pair <string, int>(currentVal, 1));
mCounts [prevVal] = playCounts;
}
prevVal = currentVal;
}
//find values already in map
map <string, map <string, int> > ::iterator it;
it = mCounts.find(prevVal);
if (it != mCounts.end()) {
//if value is found, do nothing
} else {
mCounts.insert(pair <string, map <string, int>>(prevVal, map <string, int>()));
}
}
}
「名前空間の使用」の習慣を試してみてください。後で多くの混乱を招く可能性があります。 – tadman
ループ内で 'playCounts'を作成するのが正しいかどうか、つまり各ループ反復で空のマップを作成するのは正しいですか? –
ところで:「2D」マップではなく)1つのマップを使用し、 '2 .. 3'のようなトランジションを' 2-> 3 'のような単一のキーとして使用し、それに応じて数を管理することをお勧めします。 –