2012-06-08 2 views
0

Я получил эту ошибку «map/set iterator not incrementable» с кодом ниже в visual studio 2010, не могу понять это сам ... это зависящая от платформы проблема ? Ниже перечислены все разделы кода. пожалуйста, помогите мне, спасибо!map/set итератор не инкрементный

#include <vector> 
#include <map> 
#include <string> 
#include <iostream> 
using namespace std; 
void printHighChangeables(const map<string,vector<string>>& , int); 
map<string,vector<string>> computeAdjacentWords(const vector<string>&); 

int main() 
{ 

    string v1[16]={"wine","dine","fine","line","nine","pine","vine","kine","wind","wing", 
     "wins","hoot","loot","soot","root","boot"}; 
    const vector<string> words (&v1[0], &v1[15]); 

    map<string,vector<string>> adjWords = computeAdjacentWords(words); 
    printHighChangeables(adjWords,3); 
} 

void printHighChangeables(const map<string,vector<string>>& adjWords, int minWords=3) 
{ 
    map<string,vector<string>>::const_iterator itr; 
    for(itr = adjWords.begin(); itr != adjWords.end(); itr++) 
    { 
     const pair<string,vector<string>>& entry = *itr; 
     const vector<string> & words = entry.second; 
     if(words.size() >= minWords) 
     { 
      cout<<entry.first<<"("<<words.size()<<"):"; 
      for (int i = 0; i<words.size(); i++) 
       cout<<" "<<words[i]; 
      cout<<endl; 
     } 
    } 
} 


//computes a map in which the keys are words and values are vectors of words 
//that differ in only one character from the corresponding key 
//Uses an efficient algorithm that is O(NlogN) with a map 
map<string,vector<string>> computeAdjacentWords(const vector<string>& words) 
{ 
    map<string,vector<string>> adjWords; 
    map<int,vector<string>> wordsByLength; 
    for(int i=0; i<words.size(); i++) 
     wordsByLength[words[i].length()].push_back(words[i]); 
    //work on each group separately 
    map<int,vector<string>>::const_iterator itr; 
    for(itr=wordsByLength.begin(); itr!=wordsByLength.end();itr++) 
    { 
     const vector<string>& groupsWords = itr->second; 
     int groupNum = itr->first; 
     //work on each position in each group 
     for(int i = 0; i<groupNum; i++) 
     { 
      //Remove a character in given position, computing representatives 
      //Words with same representatives are adjacent; so populate a map 
      map<string,vector<string>> repToWord; 
      for(int j=0; j<groupsWords.size(); j++) 
      { 
       string rep = groupsWords[j]; 
       rep.erase(i,1); 
       repToWord[rep].push_back(groupsWords[j]); 
      } 
      map<string,vector<string>>::const_iterator itr2; 
      for(itr2 = repToWord.begin(); itr2 != repToWord.end(); itr++) 
      { 
       const vector<string> & clique = itr2->second; 
       if(clique.size() >= 2) 
        for(int p=clique.size(); p<clique.size(); p++) 
         for(int q=p+1; q<clique.size(); q++) 
         { 
          adjWords[clique[p]].push_back(clique[q]); 
          adjWords[clique[q]].push_back(clique[p]); 
         } 
      } 
     } 
    } 
    return adjWords; 
} 
+1

Слишком много кода, чтобы читать ... Вы случайно не модифицируя 'map', как вы итерацию над ней? –

+0

Решил это .. Сделал глупую ошибку - -! Спасибо! @ K-ballo –

ответ

7

Этот цикл увеличивает неправильный итератора:

for(itr2 = repToWord.begin(); itr2 != repToWord.end(); itr++) 
               //  ^^^^^ should be itr2 
+0

Какая глупая ошибка, которую я сделал ... Большое спасибо за ваш тщательный обзор! –

Смежные вопросы