C ++: Почему мой код (с перестановочным индексом) печатается неправильно? - PullRequest
3 голосов
/ 02 декабря 2010

Я иду сам, хотя проблемы с Ускоренным C ++, и это первая проблема, с которой у меня возникают какие-либо проблемы.

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

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

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

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

РЕДАКТИРОВАТЬ: Содержание текстового файла читать:

Быстрая коричневая лиса
Theмедленная коричневая лиса
быстрая голубая собака

#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 Ответ

1 голос
/ 02 декабря 2010

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

Я бы немного упростил перестановку до ...

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());

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

Спасибо Крису за исправление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...