Моя цель - сделать простую функцию, которая будет вставлять объекты в вектор, сохраняя их в алфавитном порядке, чтобы я мог позже легко искать в векторе.

Это мой упрощенный пример:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

class Names {
public:
    Names(void);
    ~Names(void);
    bool Insert(const string & namer);
private:

    struct Person {
        string name;
    };
    vector<Person>people;
};

Names::Names() {
};

Names::~Names() {
};

bool Names::Insert(const string& namer) {
    Person p;
    p.name = namer;
    people.insert(upper_bound(people.begin(), people.end(), p), p);
}

int main(int argc, char** argv) {
    Names b1;
    bool status;
    status = b1 . Insert("John Smith");
    status = b1 . Insert("Bat Man");
    status = b1 . Insert("A Aron");
    return 0;
}

Это не работает, вероятно, потому что функция upper_bound не может сравнивать строку. Может ли кто-нибудь помочь мне, как правильно использовать функцию вставки для вставки в нужное место?

Спасибо за любую помощь.

Редактировать:

Моя проблема в том, что мое решение не работает из-за проблем с компиляцией, и я хотел бы узнать, почему.

0
Pastx 16 Мар 2014 в 18:56
5
Вы уверены, что вектор — лучшая структура данных для ваших целей? Возможно, стоит подумать о карте.
 – 
Fred Larson
16 Мар 2014 в 18:58
Я знаю, что карта лучше, но мне нужно использовать вектор или создать свою собственную структуру данных, и я хотел бы избежать проблем с выделением памяти самостоятельно.
 – 
Pastx
16 Мар 2014 в 18:59
Если вас поразил вектор, используйте std::sort после заполнения всех элементов вектором.
 – 
Mahesh
16 Мар 2014 в 19:00
1
Вам нужно вставить в алфавитном порядке, или можно просто вставить, а затем отсортировать?
 – 
Some programmer dude
16 Мар 2014 в 19:01
2
@TomášPastorek: Не нужно ничего, кроме ASCII-7, в class Names - это забавный POV для кого-то, у кого есть два символа не-ASCII-7 в его имени. Я очень надеюсь, что это домашнее задание, и я очень надеюсь, что ваш инструктор действительно расскажет вам о важности i18n.
 – 
DevSolar
17 Мар 2014 в 13:35

2 ответа

Лучший ответ

Вы должны определить operator < для класса Person. Например, это может быть функция-член класса

struct Person {
    bool operator <( const pserson &rhs ) const { return ( name < rhs.name ); }
    string name;
};
4
Vlad from Moscow 16 Мар 2014 в 19:23

Да, вы можете использовать std::sort.

Принимает три аргумента,

Sort(your_vector.begin(),your_vector.end(),predicate)

Вы можете определить свою функцию-предикат для сортировки объектов по алфавиту.

0
herohuyongtao 16 Мар 2014 в 20:48