У меня есть простая программа C ++, которая управляет в качестве списка Todo. TODO , класс содержит вектор элемента для отслеживания каждого действия TODO и их идентификатора . Ограничение ключей состоит в том, что идентификаторы должны быть строго последовательными и соответствуют порядку в списке.
Мое текущее решение использует функцию члена fix () в todo , которая итерация в векторе элементов для обеспечения соблюдения идентификатора . есть ли более эффективный способ убедиться, что идентификаторы в списке являются последовательными , даже после удаления элемента? Обратите внимание, что речь идет не об использовании идентификаторов в первую очередь.Todo todos = Todo();
todos.add("Take out the trash.");
todos.add("Do the laundry.");
todos.add("Read a book.");
todos.add("Make dinner.");
Наш список TODO имеет последовательные идентификаторы 0, 1, 2, 3 , который мы можем проверить, когда мы отображаем его с помощью list () :
{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.")}]}
Давайте удалим элемент при id 2 :
todos.remove(2);
< /code>
Результат: < /p>
{Todo[{Item(id=0, desc="Take out the trash.")}, {Item(id=1, desc="Do the laundry.")}, {Item(id=3, desc="Make dinner.")}]}
Идентификаторы все еще упорядочены, но в последовательности есть разрыв: 0, 1, 3 . Я хочу, чтобы они были строго последовательными, то есть 0, 1, 2 .
Если я позвоню в свою функцию fix () , он будет выполнять каждый индекс нашего Todos , проверьте, соответствует ли идентификатор элементов ожидаемому следующему идентификатору, если он не устанавливает идентификатор элементов в текущий идентификатор (идентификатор элементов (идентификатор текущего идентификатора (идентификатор элементов (идентификатор текущего идентификатора (идентификатор элементов (идентификатор элементов (соответствует ожидаемому следующему идентификальноi)
void Todo::fix() {
for (int i = 0; i < static_cast(todos.size()); i++) {
if (todos.getId() != i) {
todos.setId(i);
}
}
}
Если мы запустим его после remove () , наш Todos теперь снова появится чистым, со строгими последовательными идентификаторами 0, 1, 2 :
{Todo[{Item(id=0, desc="Take out the trash.")}, {Item(id=1, desc="Do the laundry.")}, {Item(id=2, desc="Make dinner.")}]}
< /code>
Я получил результат, который я хотел, но вот вопрос: < /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 ... ntial-in-c
Есть ли лучший способ сохранить идентификаторы в векторной последовательности в C ++? ⇐ C++
Программы на C++. Форум разработчиков
1756227573
Anonymous
У меня есть простая программа C ++, которая управляет в качестве списка Todo. TODO , класс содержит вектор элемента для отслеживания каждого действия TODO и их идентификатора . Ограничение ключей состоит в том, что идентификаторы должны быть строго последовательными и соответствуют порядку в списке.
Мое текущее решение использует функцию члена fix () в todo , которая итерация в векторе элементов для обеспечения соблюдения идентификатора . [b] есть ли более эффективный способ убедиться, что идентификаторы в списке являются последовательными [/b], даже после удаления элемента? Обратите внимание, что речь идет не об использовании идентификаторов в первую очередь.Todo todos = Todo();
todos.add("Take out the trash.");
todos.add("Do the laundry.");
todos.add("Read a book.");
todos.add("Make dinner.");
Наш список TODO имеет последовательные идентификаторы 0, 1, 2, 3 , который мы можем проверить, когда мы отображаем его с помощью list () :
{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.")}]}
Давайте удалим элемент при id 2 :
todos.remove(2);
< /code>
Результат: < /p>
{Todo[{Item(id=0, desc="Take out the trash.")}, {Item(id=1, desc="Do the laundry.")}, {Item(id=3, desc="Make dinner.")}]}
Идентификаторы все еще упорядочены, но в последовательности есть разрыв: 0, 1, 3 . Я хочу, чтобы они были строго последовательными, то есть 0, 1, 2 .
Если я позвоню в свою функцию fix () , он будет выполнять каждый индекс нашего Todos , проверьте, соответствует ли идентификатор элементов ожидаемому следующему идентификатору, если он не устанавливает идентификатор элементов в текущий идентификатор (идентификатор элементов (идентификатор текущего идентификатора (идентификатор элементов (идентификатор текущего идентификатора (идентификатор элементов (идентификатор элементов (соответствует ожидаемому следующему идентификальноi)
void Todo::fix() {
for (int i = 0; i < static_cast(todos.size()); i++) {
if (todos[i].getId() != i) {
todos[i].setId(i);
}
}
}
Если мы запустим его после remove () , наш Todos теперь снова появится чистым, со строгими последовательными идентификаторами 0, 1, 2 :
{Todo[{Item(id=0, desc="Take out the trash.")}, {Item(id=1, desc="Do the laundry.")}, {Item(id=2, desc="Make dinner.")}]}
< /code>
Я получил результат, который я хотел, но вот вопрос: < /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
Подробнее здесь: [url]https://stackoverflow.com/questions/79739095/is-there-a-better-way-to-keep-ids-in-a-vector-sequential-in-c[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия