Это хорошее место для применения идиомы удаления/стирания:
accDetails.erase(
std::remove_if(
accDetails.begin(), accDetails.end(),
[username](AccDetails const &a) { return username == a.username; }),
accDetails.end());
В качестве бонуса это, вероятно, будет немного быстрее, чем то, что вы делали (или, может быть, немного быстрее, если ваш вектор большой). Стирание каждого элемента по отдельности заканчивается как O(N2), но это будет O(N), что может быть довольно важным, когда/если N становится большим.
Если вы не можете использовать С++ 11, лямбда не будет работать, поэтому вам нужно будет отдельно закодировать это сравнение:
class by_username {
std::string u;
public:
by_username(std::string const &u) : u(u) {}
bool operator()(AccDetails const &a) {
return u == a.username;
}
};
accDetails.erase(
std::remove_if(accDetails.begin(), accDetails.end(), by_username(username)),
accDetails.end());
В качестве альтернативы вы можете перегрузить operator==
для своего класса AccDetails
и обработать сравнение там. Например:
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
#include <iterator>
class AccDetail {
std::string name;
int other_stuff;
public:
AccDetail(std::string const &a, int b) : name(a), other_stuff(b) {}
bool operator==(std::string const &b) {
return name == b;
}
friend std::ostream &operator<<(std::ostream &os, AccDetail const &a) {
return os << a.name << ", " << a.other_stuff;
}
};
int main(){
std::vector<AccDetail> ad = { {"Jerry", 1}, { "Joe", 2 }, { "Bill", 3 } };
std::cout << "Before Erase:\n";
std::copy(ad.begin(), ad.end(), std::ostream_iterator<AccDetail>(std::cout, "\n"));
ad.erase(
std::remove(ad.begin(), ad.end(), "Joe"),
ad.end());
std::cout << "\nAfter Erasing Joe:\n";
std::copy(ad.begin(), ad.end(), std::ostream_iterator<AccDetail>(std::cout, "\n"));
}
person
Jerry Coffin
schedule
03.08.2013