2016-04-06 20 views
-2

私はベクトル内の特定のオブジェクトを削除する方法を理解しようとしています。 idという名前の文字列に基づいてベクトルを検索しています。誰かが空白を埋めるのを助けることができると願っています!ありがとう!私は有効な消去方法ですか?C++ベクトル内の特定のオブジェクトを削除するには?

私のベクトルは、このようなものです:

vector<member*> memb; 

を、これは私がこれまで持っているものです。

for (int i = 0; i < memb.size(); i++) 
{ 
    if(std::find(memb.begin(),memb.end(), id) != memb.end()) { 
     myvector.erase (memb.begin(),memb.begin()=id); 
    } 
} 

答えて

3

は、あなたのループを取り除きます。 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); 
} 
0
vector<member *>::iterator iter; 
    for (iter=memb.begin(); iter!=memb.end();) { 
     if ((*iter)->id == id) { 
      delete (*iter); 
      iter = memb.erase(iter); 
     } else { 
      iter++; 
     } 
    } 
+3

スタックオーバーフローへようこそ!このコードは質問に答えるかもしれませんが、このコードが質問に答える理由*および/または*方法*に関する追加の文脈を提供することで、長期的な価値が向上します。 –

関連する問題