は、あなたのループを取り除きます。 std::find()
(およびstd::find_if()
)が必要なループ処理を行います。
std::find()
(およびstd::find_if()
)は、見つかった場合は要素に反復子を返し、見つからない場合は指定されたlast
反復子を返します。要素が見つかった場合は、返された反復子をベクトルのerase()
メソッドに渡して要素を削除します。
ベクトルにポインタを格納するため、std::find()
を使用してstd::string
の値で検索することはできません。代わりにstd::find_if()
を使用する必要があります。後でC++ 11以上を使用している場合は、
struct isID
{
const std::string &m_id;
isID(const std::string &id) : m_id(id) {}
bool operator()(const member *m) const
{
return (m->id == m_id);
}
};
std::string id = ...;
std::vector<member*>::iterator iter = std::find_if(memb.begin(), memb.end(), isID(id));
if (iter != memb.end())
{
// since you are storing pointers in the vector, you
// need to free the object being pointed at, if noone
// else owns it...
//delete *iter;
memb.erase(iter);
}
をまたは::
これを試してみてください
std::string id = ...;
auto iter = std::find_if(memb.begin(), memb.end(),
[id](const member* m) { return (m->id == id); });
if (iter != memb.end())
{
// since you are storing pointers in the vector, you
// need to free the object being pointed at, if noone
// else owns it...
//delete *iter;
memb.erase(iter);
}
を後者の場合には、ベクトルがある場合オブジェクトを所有することを目的として、ベクトルにstd::unique_ptr
オブジェクトを格納して、自動的にを解放することができますあなたのための個のオブジェクト:
std::vector<std::unique_ptr<member>> memb;
...
std::unique_ptr<member> m(new member);
// or: std::unique_ptr<member> m = std::make_unique_ptr<member>();
memb.push_back(std::move(m));
// or: memb.push_back(std::unique_ptr<member>(new member));
// or: memb.push_back(std::make_unique<member>());
// or: memb.emplace_back(new member);
...
if (iter != memb.end())
{
// std::unique_ptr will free the object automatically
// when the std::unique_ptr itself is destroyed...
memb.erase(iter);
}
スタックオーバーフローへようこそ!このコードは質問に答えるかもしれませんが、このコードが質問に答える理由*および/または*方法*に関する追加の文脈を提供することで、長期的な価値が向上します。 –