神秘的设置迭代器行为

时间:2015-03-17 22:02:45

标签: c++ c++11 visual-c++ iterator

如果我使用" 4 petr egor"的输入编译并运行以下程序我得到" 2 2 2"的输出,但是预期的输出应该是" 2 1 2",由于某种原因,从底部if语句的第二个输出* iter I得到" 2",如果我输出* charMap.begin() - > second.begin(),我得到" 1"。为什么会这样?

#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <algorithm>

using namespace std;

int hammingdist(const string& S, const string& T) {
    int count = 0;
    for (int i = 0; i < S.size(); ++i) {
        if (S[i] != T[i]) count++;
    }
    return count;
}

int main() {
int n;
string T, S;
cin >> n >> T >> S;

map<char, set<int>> charMap;
vector<int> diffVec;

for (int i = 0; i < S.size(); ++i) {
    if (T[i] != S[i]) diffVec.push_back(i);
}

for (int i = 0; i < diffVec.size(); ++i) {
    charMap[S[diffVec[i]]].insert(diffVec[i]);
    charMap[T[diffVec[i]]].insert(diffVec[i]);
}

auto removeIter = charMap.begin();
while (removeIter != charMap.end()) {
    if (removeIter->second.size() == 1) {
        auto toRemove = removeIter;
        ++removeIter;
        charMap.erase(toRemove);
        continue;
    }
    if (removeIter != charMap.end())
        ++removeIter;
}

if (charMap.empty()) {
    cout << hammingdist(S, T) << endl;
    cout << "-1 -1";
}
else if (charMap.size() == 1) {
    cout << hammingdist(S, T) - 1 << endl;
    auto iter = charMap.begin()->second.begin();
    cout << (*/*charMap.begin()->second.begin()*/iter) + 1 << ' ' << (*(++iter) + 1); // the problem is here
}
else if (charMap.size() >= 2) {
    cout << hammingdist(S, T) - 2 << endl;
    auto iter = charMap.begin()->second.begin();
    cout << ((*iter) ) << ' ' << (*(++iter) + 1);
}
}

1 个答案:

答案 0 :(得分:0)

原来它首先增加“iter”,然后输出2个输出。 改变这个:

cout << (*iter) + 1 << ' ' << (*(++iter) + 1);

到此:

cout << (*iter) + 1 << ' ';
++iter;
cout << (*iter) + 1;

修好了。总而言之,这是一个cout问题,而不是设置迭代器。