根据没有类或结构的另一个向量的元素对一个向量进行排序 [英] Sort One Vector Based on the Elements of Another Vector With no Class or Struct

查看:92
本文介绍了根据没有类或结构的另一个向量的元素对一个向量进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

const int max_applications_num = 1000;

vector<string> vector_authors;
vector<string> vector_titles;
vector<string> vector_venue;
vector<int> vector_year;
vector<string> vector_presentation;

void Tokenize(string line, vector<string> &tokens, string delimiters = "\t ") {
    string token = "";
    string OneCharString = " ";
    for (int i = 0; i < line.size(); i++)
        if (find(delimiters.begin(), delimiters.end(), line[i]) !=
            delimiters.end()) // line[i] is one of the delimiter characters
        {
            if (token != "")
                tokens.push_back(token);
            token = "";
        } else {
            OneCharString[0] = line[i];
            token += OneCharString;
        }

    if (token != "")
        tokens.push_back(token);
}

void SaveApplication(const vector<string> &tokens) {

    string authors = tokens[1];
    string title = tokens[2];
    string venue = tokens[3];
    int year = atoi(tokens[4].c_str());
    string presentation = tokens[5];

    vector_authors.push_back(authors);
    vector_titles.push_back(title);
    vector_venue.push_back(venue);
    vector_year.push_back(year);
    vector_presentation.push_back(presentation);

    // cout << "in save" << endl;
}

void remove_application(int pos) {

    vector_authors.erase(vector_authors.begin() + pos);
    vector_titles.erase(vector_titles.begin() + pos);
    vector_venue.erase(vector_venue.begin() + pos);
    vector_year.erase(vector_year.begin() + pos);
    vector_presentation.erase(vector_presentation.begin() + pos);

    // cout << "in remove" << endl;
}

void sort() {
    for (int j = 0; j <= vector_year.size() - 1; j++) {

        int temp1 = vector_year.at(j);
        int i = j - 1;
        while (i > -1 and vector_year.at(i) > temp1) {
            vector_year.at(i + 1) = vector_year.at(i);
            i = i - 1;
        }
        vector_year.at(i + 1) = temp1;
    }

    for (int j = 0; j <= vector_authors.size() - 1; j++) {
        string temp2 = vector_authors.at(j);
        int i = j - 1;
        while (i > -1 and vector_authors.at(i) > temp2) {
            vector_authors.at(i + 1) = vector_authors.at(i);
            i = i - 1;
        }
        vector_authors.at(i + 1) = temp2;
    }

    for (int j = 0; j <= vector_titles.size() - 1; j++) {
        string temp3 = vector_titles.at(j);
        int i = j - 1;
        while (i > -1 and vector_titles.at(i) > temp3) {
            vector_titles.at(i + 1) = vector_titles.at(i);
            i = i - 1;
        }
        vector_titles.at(i + 1) = temp3;
    }
    for (int j = 0; j <= vector_venue.size() - 1; j++) {
        string temp4 = vector_venue.at(j);
        int i = j - 1;
        while (i > -1 and vector_venue.at(i) > temp4) {
            vector_venue.at(i + 1) = vector_venue.at(i);
            i = i - 1;
        }
        vector_venue.at(i + 1) = temp4;
    }
    for (int j = 0; j <= vector_presentation.size() - 1; j++) {
        string temp5 = vector_presentation.at(j);
        int i = j - 1;
        while (i > -1 and vector_presentation.at(i) > temp5) {
            vector_presentation.at(i + 1) = vector_presentation.at(i);
            i = i - 1;
        }
        vector_presentation.at(i + 1) = temp5;
    }

    // cout << "in sort" << endl;
}

void print() {

    for (int i = 0; i < vector_authors.size(); i++) {
        cout << vector_authors.at(i) << "\t" << vector_titles.at(i) << "\t"
             << "\t" << vector_venue.at(i) << "\t" << vector_year.at(i) << "\t" << vector_presentation.at(i) << endl;
    }
    cout << "\n" << endl;
}

void ExecuteCommands(const char *fname) {
    ifstream inf;
    inf.open(fname);

    string line;
    while (getline(inf, line).good()) {
        vector<string> tokens;
        Tokenize(line, tokens, "\t ");
        if (tokens.size() == 0)
            continue;

        if (tokens[0].compare("save_application") == 0)
            SaveApplication(tokens);

        else if (tokens[0].compare("remove_application") == 0)
            remove_application(atoi(tokens[1].c_str()));

        else if (tokens[0].compare("sort") == 0)
            sort();

        else if (tokens[0].compare("print") == 0)
            print();
    }

    inf.close();
}

int main(int argc, char **argv) {
    if (argc != 2) {
        cout << "usage: executable.o command.txt\n";
        return 1;
    }

    ExecuteCommands(argv[1]);
    return 0;
}

因此,这是我在学校正在做的实验室的代码.我们应该将某些元素放入向量中,打印这些向量,对其进行排序,再次打印它们,删除向量,最后一次打印它们.对于我们的排序,我们需要根据发布年份对它们进行排序.

So, here is my code for a lab I am doing at school. We are supposed to put certain elements in a vector, print those vectors, order them, print them again, remove a vector, print them one last time. For our sort, we need to order them based on the year of publication.

"authors_list1" "title1" "conference1"  2016    "poster"
"authors_list3" "title3" "conference2"  2010    "oral"
"authors_list2" "title2" "journal1" 2015    "none"

所以,当我排序时,我得到了:

So, when I sort, I get this:

"authors_list1" "title1" "conference1"  2010    "none"
"authors_list2" "title2" "conference2"  2015    "oral"
"authors_list3" "title3" "journal1" 2016    "poster"

这是预期的输出:

"authors_list3" "title3"    "conference2"   2010    "oral"
"authors_list2" "title2"    "journal1"  2015    "none"
"authors_list1" "title1"    "conference1"   2016    "poster"

年份的顺序是正确的,但其他所有顺序都不正确.我需要我的其他要素来追随岁月的流逝.有什么办法吗?

The order of the years are correct, but the orders of everything else are not. I need my other elements to follow suit with the years. Is there any way to do that?

P.S.在本实验中,我们不允许使用类或结构.这就是我所有的代码.

P.S. For this lab, we are not allowed to use classes or structs. This is all the code I have.

推荐答案

您可以使用以下方法伪造非笨拙的数据结构

You can fake a non-clumsy data structure with

vector<vector<string> > database;

vector<string>是单个记录.为了使其可管理",我将使用一些别名,访问器函数和该枚举:

Where vector<string> is a single record. To make it "manageable" I'd use some aliases, accessor functions and this enum:

enum { AUTHOR, TITLE, VENUE, YEAR, PRESENTATION };

代码变得更短了:

在Coliru上直播

#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
#include <cassert>
using namespace std;

const int max_applications_num = 1000;

enum { AUTHOR, TITLE, VENUE, YEAR, PRESENTATION };

vector<vector<string> > database;

void Tokenize(string line, vector<string> &tokens, string delimiters = "\t ") {
    string token = "";
    string OneCharString = " ";
    for (size_t i = 0; i < line.size(); i++)
        if (find(delimiters.begin(), delimiters.end(), line[i]) !=
            delimiters.end()) // line[i] is one of the delimiter characters
        {
            if (token != "")
                tokens.push_back(token);
            token = "";
        } else {
            OneCharString[0] = line[i];
            token += OneCharString;
        }

    if (token != "")
        tokens.push_back(token);
}

void SaveApplication(const vector<string> &tokens) {
    database.emplace_back(tokens.begin()+1, tokens.end());
}

void remove_application(size_t pos) {
    assert(pos < database.size());
    database.erase(database.begin()+pos);
}

int year_of(vector<string> const &record) { return stoi(record[YEAR]); }
int year_of(int i) { return year_of(database.at(i)); }

void sort() {
    for (size_t j = 0; j <= database.size() - 1; j++) {

        vector<string> tmp = database.at(j);

        int tmp_year = year_of(tmp);

        int i = j - 1;
        while (i > -1 and year_of(i) > tmp_year) {
            database.at(i + 1) = database.at(i);
            i = i - 1;
        }

        database.at(i + 1) = tmp;
    }
}

void print() {
    for (size_t i = 0; i < database.size(); i++) {
        cout 
            << database.at(i)[AUTHOR] << "\t"
            << database.at(i)[TITLE]  << "\t"
            << database.at(i)[VENUE]  << "\t"
            << database.at(i)[YEAR]   << "\t"
            << database.at(i)[PRESENTATION] 
            << endl;
    }
    cout << "\n" << endl;
}

void ExecuteCommands(const char *fname) {
    ifstream inf;
    inf.open(fname);

    string line;
    while (getline(inf, line).good()) {
        vector<string> tokens;
        Tokenize(line, tokens, "\t ");
        if (tokens.size() == 0)
            continue;

        if (tokens[0].compare("save_application") == 0)
            SaveApplication(tokens);

        else if (tokens[0].compare("remove_application") == 0)
            remove_application(atoi(tokens[1].c_str()));

        else if (tokens[0].compare("sort") == 0)
            sort();

        else if (tokens[0].compare("print") == 0)
            print();
    }

    inf.close();
}

int main(int argc, char **argv) {
    if (argc != 2) {
        cout << "usage: executable.o command.txt\n";
        return 1;
    }

    ExecuteCommands(argv[1]);
}

输入

save_application "authors_list1"    "title1" "conference1"  2016    "poster"
save_application "authors_list3"    "title3" "conference2"  2010    "oral"
save_application "authors_list2"    "title2" "journal1" 2015    "none"
print
sort
print
remove_application 0
print

打印

"authors_list1" "title1"    "conference1"   2016    "poster"
"authors_list3" "title3"    "conference2"   2010    "oral"
"authors_list2" "title2"    "journal1"  2015    "none"


"authors_list3" "title3"    "conference2"   2010    "oral"
"authors_list2" "title2"    "journal1"  2015    "none"
"authors_list1" "title1"    "conference1"   2016    "poster"


"authors_list2" "title2"    "journal1"  2015    "none"
"authors_list1" "title1"    "conference1"   2016    "poster"

这篇关于根据没有类或结构的另一个向量的元素对一个向量进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆