Gibt es eine bessere Möglichkeit, einen Vektor in einer geordneten Sequenz in C ++ zu halten?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Gibt es eine bessere Möglichkeit, einen Vektor in einer geordneten Sequenz in C ++ zu halten?

by Anonymous » 18 Aug 2025, 22:44

Ich habe ein einfaches C ++ - Programm, das als Todo -Liste fungiert. Es enthält einen Vektor, der Klassentyp von Element enthält, um jeden Todo zu verfolgen. Dies ist effizienter, während diese unsichtbaren Einschränkungen immer noch ein Vektor , das Klassenelement und das Verfolgen von IDs verfolgen. Beachten Sie, dass dies keine Frage ist, warum Sie in erster Linie IDs einstellen.

Code: Select all

Todo todos = Todo();

todos.add("Take out the trash.");
todos.add("Do the laundry.");
todos.add("Read a book.");
todos.add("Make dinner.");
< /code>
Unsere Liste sieht so aus: < /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>
[list]
[*] IDs: 0, 1, 2, 3 < /code> < /li>
< /ul>

Wenn ich das Element bei ID 2 < /code> < /p>
 entfernen ">todos.remove(2);
< /code>
Das Ergebnis ist: < /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>

Jetzt haben wir das Element bei ID 2 < /code>, aber [url=viewtopic.php?t=14917]ich möchte[/url] es in einer [b] geordneten Sequenzen < /strong> von ids behalten. 2 
.
Wenn ich meine Funktion fix () aufrufe, wird sie durch jeden Index unseres Todos überprüft, ob die ID der Elemente mit der erwarteten nächsten ID übereinstimmt. Wenn dies nicht der Fall ist, setzen Sie die Elements -ID auf den aktuellen Iterationsindex (Iterationsindex ((

Code: Select all

i
)

Code: Select all

void Todo::fix() {
for (int i = 0; i < static_cast(todos.size()); i++) {
if (todos[i].getId() != i) {
todos[i].setId(i);
}
}
}
< /code>
Hier ist mein 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();
Wenn wir dies ausführen, wird unser Todos jetzt:
sein

Code: Select all

{Todo[{Item(id=0, desc="Take out the trash.")}, {Item(id=1, desc="Do the laundry.")}, {Item(id=2, desc="Make dinner.")}]}
IDs [/b]: 0, 1, 2
[/list]
Großartig! Ich habe das Ergebnis, das ich wollte, aber hier ist die Frage: < /p>
Ist dies die effizienteste Möglichkeit, diese Aufgabe in C ++ zu erledigen? Wenn dies eine größere Liste wäre, könnte es ressourcenintensiv und langsam werden. Gibt es eine schnellere/effizientere Möglichkeit, dies zu tun?

Code: Select all

#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

Top