.back和排序函数

时间:2015-07-07 03:56:54

标签: c++ sorting

我是c ++的完全初学者,对于作业,我被要求对超级英雄的文本文件进行排序并将其输出到另一个文本文件,例如:

Unsorted.txt

Deadpool_8

Phoenix_9

Toad_4

Jubilee_3

按字母顺序和数字顺序排列。

我试图为每行字符串使用.back进行数字排序,虽然它根本不会接受它并返回错误(我已经包含在代码中)以及尽管它很乐意写入控制台完全与cout尝试写入文本文件只导致最后一行字符串,例如

Toad_4

(我的所有错误都已被注释掉,目前只按字母顺序排序)

我对与其他人提出同样的问题感到妄想,但我找不到能解决问题的任何事情。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <fstream>
#include <limits>
using namespace std;
// Empty vector holding names from file
vector<string> names;
string word;
string number;
string filename;
string sortChoice;
string lastChar;
bool alphaSortFinished = false; //bool added to prevent unnecessary looping
bool sortFinished = false;

void sortNumerically()
{
//word = word.back;         returns this error
/*Error 1   error C3867:         'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::back': function call missing argument list; use 
'&std::basic_string<char,std::char_traits<char>,std::allocator<char>>::back' to create a pointer to member  
d:\visual studio 2013\assessment one mdu118\strings, classes assessment one\source.cpp  20  1   Strings, Classes Assessment One*/


cout << "Please specify the file you would like to open\n" << endl;
cin >> filename;

// Read names from specified file
ifstream inFile(filename);

while (!inFile && sortFinished == false)
{
    cout << "Unable to open file\n";
    inFile.close();
    sortNumerically();
}

while (getline(inFile, word)) //get lines of the string, store them in string word;
{
    names.push_back(word);
}

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

// Loop to print names
for (size_t i = 0; i < names.size(); i++)
{
    //ofstream writeToFile;
    //writeToFile.open("NumericalSort.txt");
    //writeToFile << names[i] << '\n';
    //writeToFile.close();
    cout << names[i] << '\n';
}
sortFinished = true;
inFile.close();
}
很抱歉,可能有很多废话涉及我没有包含的其他功能。我采取了错误的路线吗?

提前谢谢

2 个答案:

答案 0 :(得分:1)

填充vector字符串

vector<string> names;
ifstream inFile(filename);
copy(istream_iterator<string>(inFile), istream_iterator<string>(), back_inserter(names));

按字典顺序排序

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

按数字排序

sort(names.begin(), names.end(), cmpr());

cmpr是一个自定义比较器,用于比较字符串的数字部分。

要获取字符串的数字部分,请使用

int num = stoi(s.substr(s.find_last_of('_') + 1));

C++11

中的示例
sort(names.begin(), names.end(), [](const string & a, const string & b) {
    int ia = stoi(a.substr(a.find_last_of('_') + 1));
    int ib = stoi(b.substr(b.find_last_of('_') + 1));
    return ia < ib;
});

请参阅http://ideone.com/1Wcnvq演示

答案 1 :(得分:0)

将文件中的名称读取到function fill(fmm, xx, ...) #TO BE IMPLEMENTED! println("Hi") end function gibbs_sampler(fmm::FiniteMixtureModel{Gaussian1DGaussian1D}, xx::Vector{Float64}, ...) fill(fmm, xx, ...) end function gibbs_sampler(fmm::FiniteMixtureModel{MultinomialDirichlet}, xx::Vector{Int64}, ...) fill(fmm, xx, ...) end ... ...

std::vector<string>

现在,

sort(names.begin(), names.end()).

比较器应该使用2个字符串作为参数,并比较字符串的数字部分。