2016-04-01 21 views
0

Başka bir yapı içeren ve birinci yapıdan bir öğeyi silmek isteyen bir yapıya sahibim. 1 ** ilk yapı:başka bir yapıyı içeren bir öğenin içine ekleme ve silme

struct Solution { 

    Problem *_Problem; 

    vector<Tour> _tour; . 
    vector<unsigned int> length; 
    unsigned int nbrCleint; 
    unsigned int TotalDemande; 
} 

2 ** ikinci yapı: iki yapı, bu gibi tanımlanmıştır

struct Tour{ 
    vector<unsigned int> clientVisite; 
    unsigned int demande; 
    vector<unsigned int> CostScenario; 
    Tour(); 
    void clear(); 
}; 

ve şimdi yapı "Çözelti", bir elemanın silmek isteyen; Exemple için eleman silmek nerede solution._tour.clientVisite == "bazı vektör"

bunu nasıl yapabilirim? ve aynı ilkeye nasıl bir eleman ekleyebilirim?

Not C++ < C++ 11

cevap

0
Solution s; 
for (vector<Tour>::iterator i = s._tour.begin(); i != s._tour.end(); ++i) { 
    if (i->clientVisite == somevector) { 
    s._tour.erase(i); break; 
    } 
} 
+0

Cevabınız için size teşekkür ederim, ama işe yaramıyor! –

+1

Bu kod soruyu yanıtlayabilirken, sağlamasının _why_ ve/veya _how_ yönergelerine ilişkin ek bağlamı ile karşı karşıya getirirken, bu soru uzun vadeli değerini önemli ölçüde artıracaktır. Lütfen bazı açıklama eklemek için cevabınızı [düzenleyin]. –

0
struct Solution { 

    /// Remove every tour where the tour's visit array exactly matches visit 
    /// @param visit is a vector of unsigned ints representsing locations 
    /// @returns the number of tours removed 
    std::size_t remove_tour_where_visit_matches(const std::vector<unsigned int> visit) 
    { 
     auto original = _tour.size(); 
     _tour.erase(std::remove_if(std::begin(_tour), std::end(_tour), 
            [&visit](const auto& tour) 
            { 
             return tour.clientVisite == visit; 
            }), 
        std::end(_tour)); 
     return original - _tour.size(); 
    } 

    Problem *_Problem; 

    vector<Tour> _tour; 
    vector<unsigned int> length; 
    unsigned int nbrCleint; 
    unsigned int TotalDemande; 
}; 

Daha sonra özel bir işlev nesnesini kullanmak henüz ++ 11c I yok:

struct equal_visit 
{ 
    equal_visit(const std::vector<unsigned int>& l) 
    : _l(l) 
    {} 

    bool operator()(const Tour& r) const 
    { 
     return _l == r.clientVisite; 
    } 

    const std::vector<unsigned int>& _l; 
}; 

struct Solution { 

    /// Remove every tour where the tour's visit array exactly matches visit 
    /// @param visit is a vector of unsigned ints representsing locations 
    /// @returns the number of tours removed 
    std::size_t 
    remove_tour_where_visit_matches(const std::vector<unsigned int>& visit) 
    { 
     std::size_t original = _tour.size(); 

     _tour.erase(std::remove_if(_tour.begin(), _tour.end(), 
            equal_visit(visit)), 
        _tour.end()); 
     return original - _tour.size(); 
    } 

    Problem *_Problem; 

    vector<Tour> _tour; 
    vector<unsigned int> length; 
    unsigned int nbrCleint; 
    unsigned int TotalDemande; 
}; 
+0

cevabınız için teşekkür ederim, ama lambda ifadeleri sadece -std = C++ 11 ile kullanılabilir, ve C++ 11'im yok, ve kodunuzu yapıya eklediğimde, çok fazla istisna yapıyorum: –

+1

eşdeğer işlev nesnesi. –

+2

@Mouaici_Med Sorunuzda bunu açıklığa kavuşturmalı ve C++ 03 etiketini eklemelisiniz. – juanchopanza