我正在走自己的速度加速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;
}*/
}
答案 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的纠正。