2015-08-14 97 views
-1
typedef struct tagSTUDENT 
{ 
    UINT32 id; 
    string name; 

}STUDENT, *LP_STUDENT; 

vector<LP_STUDENT> allStudents 
vector<LP_STUDENT> classA 

我想讓A班的學生在所有學生的開始或結束。 allStudents沒有排序。 std :: sort也會根據id或其他標準對學生進行排序嗎?使用另一個stl向量重新排序stl向量

在所有學生的末端插入classA &消除重複是一個好方法嗎?

+2

您需要爲'std :: sort'的結構定義'operator <'來工作。 – CinCout

+1

看看[std :: partition](http://en.cppreference.com/w/cpp/algorithm/partition)和[std :: stable_partition](http://en.cppreference.com/w/cpp /算法/ stable_partition)算法。 –

+2

@GargAnkit不會工作,因爲它是一個指針向量。他將不得不將自定義比較器傳遞給'std :: sort'。 –

回答

2

以下是如何使用std::partition()作爲Studentsvector,對學生指針向量的修改很簡單,但是可以用於更多的代碼。 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); } 
+0

我正在與大量的學生打交道。如果你可以編輯來提供一個有用的指針的答案。謝謝。 –

+0

@SunilMathew編輯描述如何使這個工作與'vector 's – mattnewport