C ++:为什么我的(置换索引)代码不能正确打印出来?

时间:2010-12-01 21:05:32

标签: c++ rotation permutation

我正在走自己的速度加速C ++的问题,这是我第一个遇到任何问题。

问题是编写一个能够从一组行生成permuted index的程序。

下面的代码有两个函数:permutedIndex5_1,它是排序的“main()”函数,permuteLine5_1采用给定的行(以及对已经置换的行的向量的引用)并且旋转地置换给定的行,添加每次旋转到矢量。

我遇到的问题是,在stdout上输入的线路输出不正确。我在permuteLine5_1中包含了几个3个调试语句来测试要打印的第一个和最后一个字符串,这些打印语句的结果显示打印出来的内容,但是打印出来的内容完全是不同。

我的直觉是,它可能与我擦除该函数中的迭代器有关,但我不确定如何纠正它。在任何情况下,任何帮助将不胜感激。

编辑:读取的文本文件的内容为:

  

快速棕狐   慢棕狐   快速的蓝狗

#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 个答案:

答案 0 :(得分: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());

您正在尝试对字符串向量的向量进行排序 - 这意味着排序算法需要以某种方式比较两个字符串向量以确定顺序。我认为它不能那样做,并且你需要提供一个自定义排序谓词来执行你想要的精确比较。

<击>

感谢Chris的纠正。