Есть ли лучший способ сохранить вектор в упорядоченной последовательности в C ++?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли лучший способ сохранить вектор в упорядоченной последовательности в C ++?

Сообщение Anonymous »

У меня есть простая программа C ++, которая действует как список TODO, она содержит вектор, который содержит тип класса ITEM для отслеживания каждого TODO и их идентификатора. Ответ, который является более эффективным, при этом следуя этим невидимым ограничениям его вектора , используя элемент класса и отслеживание идентификаторов. Обратите внимание, что это не вопрос о том, почему вы устанавливаете идентификаторы в первую очередь , я хочу знать, что будет лучшим методом, следуя этим правилам.Todo todos = Todo();

todos.add("Take out the trash.");
todos.add("Do the laundry.");
todos.add("Read a book.");
todos.add("Make dinner.");
< /code>
Наш список выглядит следующим образом: < /p>
{Todo[{Item(id=0, desc="Take out the trash.")}, {Item(id=1, desc="Do the laundry.")}, {Item(id=2, desc="Read a book.")}, {Item(id=3, desc="Make dinner.")}]}
< /code>
  • ids: 0, 1, 2, 3 < /code> < /li>
    < /ul>

    Если я удалю элемент 2 < /code> < /p>

    Результат: < /p>
    {Todo[{Item(id=0, desc="Take out the trash.")}, {Item(id=1, desc="Do the laundry.")}, {Item(id=3, desc="Make dinner.")}]}
    < /code>

    ids: 0, 1, 3 < /code> < /li>
    < /ul>

    Теперь мы удалили элемент в ID 2 < /code>, но я хочу сохранить его в упорядоченной последовательности. 2 .
    Если я вызову свою функцию fix () , она будет выполнять каждый индекс нашего Todos , проверьте, соответствует ли идентификатор элементов ожидаемому следующему идентификатору, если он не установите идентификатор элементов в текущий индекс итерации (i)
    void Todo::fix() {
    for (int i = 0; i < static_cast(todos.size()); i++) {
    if (todos.getId() != i) {
    todos.setId(i);
    }
    }
    }
    < /code>
    Вот мой код: < /p>
    todos.add("Take out the trash.");
    todos.add("Do the laundry.");
    todos.add("Read a book.");
    todos.add("Make dinner.");
    todos.remove(2);
    todos.fix();

    Если мы запустим это, наш Todos теперь будет:
    {Todo[{Item(id=0, desc="Take out the trash.")}, {Item(id=1, desc="Do the laundry.")}, {Item(id=2, desc="Make dinner.")}]}


    ids
    : 0, 1, 2

Отлично! Я получил результат, который хотел, но вот вопрос: < /p>
Это самый эффективный способ выполнить эту задачу в C ++? Кажется, что если бы это был больший список, он мог бы стать ресурсным и медленным. Есть ли какой-нибудь более быстрый/более эффективный способ сделать это?#include
#include

class Item {
private:
int id;
std::string description;
public:
Item() : id(0), description("") {}
Item(int id, std::string description) : id(id), description(description) {}
int getId() const { return id; }
void setId(int value) { id = value; }
std::string getDescription() const { return description; }
void setDescription(std::string value) { description = value; }
};

class Todo {
private:
std::vector todos;
public:
Todo() = default;
Todo(std::vector todos) : todos(todos) {};
bool add(std::string description);
bool remove(int id);
bool edit(int id, std::string description);
void list();
void fix();
};

bool Todo::add(std::string description) {
if (description.empty()) {
return false;
}

todos.emplace_back(todos.size(), description);
return true;
}

bool Todo::remove(int id) {
if (id < 0 || id >= static_cast(todos.size())) {
return false;
}

todos.erase(todos.begin() + id);
return true;
}

bool Todo::edit(int id, std::string description) {
if (id < 0 || id >= static_cast(todos.size()) || description.empty()) {
return false;
}

todos[id].setDescription(description);
return true;
}

void Todo::list() {
std::cout

Подробнее здесь: https://stackoverflow.com/questions/797 ... uence-in-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»