2012-01-17 21 views
12

Bir sınıf vektörü olan studentList'i ülkesine göre algoritma kullanarak nasıl filtreleyebilirim? Anlam sadece ülke "Amerika" dan öğrencilerin detayını gösterir.C++ Bir sınıf vektörünü algoritmayı kullanarak filtrelemek için

struct country_filter 
{ 
    country_filter(const std::string& a_country): country(a_country) {} 
    void operator()(const Student& a_s) const 
    { 
     if (country == a_s.country) 
     { 
      std::cout << a_s.name << "\n"; 
     } 
    } 
    std::string country; 
}; 

// 
std::for_each(studentList.begin(), studentList.end(), country_filter("Ireland")); 

C++ 11:

bool checkCountry (string x, string y) 
{ 
    return (x == y); 
} 
vector<Student> studentList; 
studentList.push_back(Student("Tom", 'M', "91213242", "America")); 
studentList.push_back(Student("Jessilyn", 'F', "98422333", "Europe")); 
+0

Bunu [silmek-remove deyim] ihtiyacım (http://en.wikipedia.org/wiki/Erase-remove_idiom). –

+1

@Oli - Sadece Amerika Birleşik Devletleri girişlerini kaldırmak istiyorsa. Onu, vektörü korumak istediğini, ancak sadece belirli öğeleri göstermesini istedim. –

+0

Diğer girdileri saklamak zorundayım, böylece silme işlemi işe yaramaz mı? – delphi316

cevap

7

Sana aradığınızı bu düşünüyorum Sen baskının filter_iterator kullanabilirsiniz

std::string country = "America"; 
std::for_each(studentList.begin(), studentList.end(), [&country] (const Student& a_s) 
{ 
    if (a_s.country == country) 
    { 
     std::cout << a_s.name << "\n"; 
    } 
}); 
8

. Altta yatan koleksiyon ile sıradan bir dizi olan Here is an example.

Aşağıda, aşağıdakiler için örnek test edilmemiş kodlar verilmiştir; Ben

struct checkCountry 
{ 
    std::string country; 
    bool operator()(const Student& x) 
    { 
    return (x.country() == country); 
    } 
}; 

int main() 
{ 
    std::vector<Student> studentList; 
    studentList.push_back(Student("Tom", 'M', "91213242", "America")); 
    studentList.push_back(Student("Jessilyn", 'F', "98422333", "Europe")); 

    typedef boost::filter_iterator<checkCountry, std::vector<Student>::iterator> FilterIter; 
    checkCountry predicate; 
    predicate.country = "America"; 
    FilterIter filter_iter_first(predicate, studentList.begin(), studentList.end()); 
    FilterIter filter_iter_last(predicate, studentList.end(), studentList.end()); 

    std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator<Student>(std::cout, " ")); 
} 
6

Sen () operatörü uygulayan bir sınıfın bir nesnesi kullanabilirsiniz (std::string country() const üzerinden çıkışa maruz ülke için operator<< geçerlidir) Student ilgili belirli varsayımlar yapmak zorunda kaldı. Örneğin, std::count_if, std::find_if, bir tekli yüklemi gerektiren herhangi algoritma bir functor kullanabilirsiniz

struct checkCountry { 
    const string& compare; 
    checkCountry(const string& compare) : compare(compare) {} 
    bool operator()(const string& x) { return x == compare; } 
}; 

vector<Student> studentList; 
studentList.push_back(Student("Tom", 'M', "91213242", "America")); 
studentList.push_back(Student("Jessilyn", 'F', "98422333", "Europe")); 
howMany = std::count_if(studentList.begin(), studentList.end(), checkCountry("America")); 

vb

+1

Amerika ve Avrupa ülkeleri ne zamandan beri? – aerkenemesis

13
using std::copy_if; 
using std::ostream_iterator; 
using std::cout; 

enum Region { 
    AMERICA, 
    EUROPE, 
    REST_OF_WORLD 
}; 

bool is_american(const Student& student) 
{ 
    return student.isFrom(AMERICA); 
} 

copy_if(students.begin(), students.end(), 
     ostream_iterator<Student>(cout, "\n"), 
     is_american); 

C bir lambda kullanarak: Bu funktor denir ++ 11, ve seçilen izin verilmesi bölgeler:

void show_students_from_region(const Region& region) 
{ 
    copy_if(students.begin(), students.end(), 
      ostream_iterator<Student>(cout, "\n"), 
      [&](const Student& student) { return student.isFrom(region); }); 
} 
+0

Menüm, kullanıcının hangi ülkeyi filtrelemek istediğini seçmesine izin vermeli? – delphi316

+0

Yukarıdaki kodda bir hata var: lambda eksik yakalama belirteci, ya varsayılan ([=] veya [&]) olmalı ya da bölgeyi açıkça belirtmeliyiz - [region] veya [& region]. –

+0

@MichaelPliskin Teşekkürler, sabit. –

İlgili konular