以下是如何使用std::partition()
作爲Students
的vector
,對學生指針向量的修改很簡單,但是可以用於更多的代碼。 Live version。如果你與大量學生打交道,你可能想要做一些更有效的工作來檢查A類的成員身份,例如使用set
或在排序的vector
上進行二分搜索。
#include <algorithm>
#include <cstdint>
#include <iostream>
#include <string>
#include <tuple>
#include <vector>
using namespace std;
struct Student {
uint32_t id;
string name;
};
bool operator==(const Student& a, const Student& b) {
return tie(a.id, a.name) == tie(b.id, b.name);
}
main() {
const auto jane = Student{3, "Jane"};
const auto zippy = Student{1, "Zippy"};
const auto classA = vector<Student>{jane, zippy};
auto allStudents = vector<Student>{{5, "Rod"}, jane, {4, "Freddy"}, zippy, {2, "Bungle"}};
partition(begin(allStudents), end(allStudents), [&](const auto& s){ return find(begin(classA), end(classA), s) == end(classA); });
for (const auto& s : allStudents) cout << s.id << ", " << s.name << "; ";
cout << endl;
}
輸出是:
5, Rod; 2, Bungle; 4, Freddy; 1, Zippy; 3, Jane;
如果你真的想與vector<Student*>
s到工作由於某種原因,則主要的變化是在partition()
調用拉姆達切換find()
爲find_if()
:
[&](const Student* s){ return find_if(begin(classA), end(classA),
[&](const Student* x){ return *x == *s; }) == end(classA); }
您需要爲'std :: sort'的結構定義'operator <'來工作。 – CinCout
看看[std :: partition](http://en.cppreference.com/w/cpp/algorithm/partition)和[std :: stable_partition](http://en.cppreference.com/w/cpp /算法/ stable_partition)算法。 –
@GargAnkit不會工作,因爲它是一個指針向量。他將不得不將自定義比較器傳遞給'std :: sort'。 –