2010-12-01 2 views
3

Я хожу сам, несмотря на проблемы с ускорением C++, и это первый случай, с которым я сталкиваюсь.C++: Почему мой код (перестановленный индекс) не распечатывается правильно?

Проблема заключается в кодировании программы, которая может генерировать permuted index из набора строк.

Код ниже содержит две функции: permutedIndex5_1, которая является функцией "main()" sorts и permuteLine5_1, которая принимает заданную строку (и ссылку на вектор уже перестроенных строк) и переставляет данную строку вращаться, добавляя каждый поворот к вектору.

Проблема, с которой я сталкиваюсь, заключается в том, что перестроенные строки неправильно печатаются на stdout. Я включил несколько операторов отладки в permuteLine5_1, чтобы протестировать первую и последнюю строки для печати, а результаты этих заявлений печати показывают, что должно быть напечатано, однако то, что печатается, совершенно иное.

У меня возникает ощущение, что это может быть связано со стиранием итератора в этой функции, но я не уверен, как его исправить. В любом случае, любая помощь будет оценена по достоинству.

EDIT: Содержимое текстового файла для чтения являются:

шустрая лиса
Медленный коричневая лиса
Быстрый голубой собаки

#include <vector> 
#include <string> 
#include <cctype> 
#include <iostream> 
#include <fstream> 
#include <sstream> 


using std::fstream; 
using std::ios; 
using std::istringstream; 
using std::vector; 
using std::string; 
using std::cin; 
using std::cout; 
using std::endl; 

void permuteLine5_1(vector< vector<string> >& lines, vector<string> curLine) 
{ 

    for(int i = 0; i < curLine.size(); i++) 
    { 
     vector<string>::iterator curBeginStrItr = curLine.begin(); 
     string curBeginStr = *curBeginStrItr; 

     curLine.erase(curBeginStrItr); 
     curLine.push_back(curBeginStr); 

     cout << "The first string in the current line is : " + *(curLine.begin()) << endl; 
     cout << "The first string in the current line is VIA INDEXING IS : " + curLine[0] << endl; 
     cout << "The last string in the current line is : " + *(curLine.rbegin()) << endl; 

     for(int j = 0; j < curLine.size(); j++) 
     { 
      cout << curLine[j]; 
     } 
     cout << endl; 

     lines.push_back(curLine); 
    } 


} 

void permutedIndex5_1() 
{ 
    vector< vector<string> > lines; 

    fstream fileLines; 
    fileLines.open("C:\\Users\\Kevin\\Desktop\\lines.txt", ios::in); 

    string curLine, curWord; 
    vector<string> curLineVec; 

    while(getline(fileLines, curLine)) 
    { 
     cout << curLine << endl; 

     curLineVec.push_back("|"); 

     istringstream strS(curLine); 

     while(getline(strS, curWord, ' ')) 
     { 
      curLineVec.push_back(curWord); 
      cout << curWord << endl; 
     } 

     lines.push_back(curLineVec); 
     curLineVec.clear(); 
    } 

    vector< vector<string> > permuted; 

    for(int i = 0; i < lines.size(); i++) 
    { 
     permuteLine5_1(permuted, lines[i]); 
    } 

    sort(permuted.begin(), permuted.end()); 

    /*Code below prints out permutations. Commented out because 
     permuting function does not work properly 

    for(int i = 0; i < permuted.size(); i++) 
    { 
     vector<string> curVec = permuted[i]; 
     for(int j = 0; j < curVec.size(); j++) 
     { 
      cout << curVec[j] << ' '; 
     } 

     cout << endl; 
    }*/ 


} 
+1

Что он должен печатать и что он печатает вместо этого? – 2010-12-01 21:13:13

+0

Он просто не поворачивает линию правильно. «|» строка всегда выводит сначала на stdout, несмотря на то, что мои инструкции отладки сообщают мне об обратном. Кроме того, некоторые буквы строк удаляются, что я не понимаю, так как я лично не касаюсь персонажей. Вот почему я думаю, что это имеет какое-то отношение к строке, на которую я возвращаюсь, поскольку это ссылка на строку, которую удалял итератор, на который я указал ... Я даже не уверен, почему код работает так, как есть, поскольку строка должен быть признан недействительным из моего понимания. – Kevin 2010-12-01 21:18:08

ответ

1

Я думаю, ваше стирание итератора прекрасное, потому что сначала вы делаете реальную копию строки, а ваш недействительный итератор не впоследствии используемый.

Я бы упростить перестановку бит в ...

for(int i = 0; i < curLine.size(); i++) 
{ 
    string curBeginStr = curLine[0]; 

    curLine.erase(curLine.begin()); 
    curLine.push_back(curBeginStr); 

Но, я думаю, что реальная проблема заключается в то, и я немного удивлен, он компилирует:

sort(permuted.begin(), permuted.end()); 

Вы пытаетесь отсортировать вектор векторов строки - это означает, что алгоритм сортировки должен каким-то образом сравнить два вектора строк для определения порядка. Я думаю, что он не может этого сделать, и вам нужно будет предоставить собственный предикат сортировки для выполнения точного сравнения.

Благодаря Крису для коррекции.

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