2013-10-01 67 views
0

所以我正在做一個任務,我需要搜索一個向量與4個變量的對象。 string,string,int,int。我對編程非常陌生。如果我只使用第一個字符串進行搜索,那麼我就可以使用二進制serach。但不知道如何使它匹配所有四個領域。C++二進制搜索與多個條件的向量

的載體由第一串排序,如果第一個字符串匹配,那麼通過第二串排序,如果第二個字符串匹配,那麼排序的,但首先INT等

到目前爲止,我的代碼是

bool Room::searchRoom(string name, string initial, int number1, int number2) { 
size_t mid, left = 0 ; 
size_t right = testVector.size(); 
while (left < right) { 
    mid = left + (right - left)/2; 
    if (name > testVector[mid].getName()){ 
     left = mid+1; 
    } 
    else if (name < testVector[mid].getName()){           
    right = mid; 
    } 
    else {                 
    return true; 

} 

return false;  
} 
+1

因此,如果第一個字符串匹配,則比較第二個字符串,如果匹配,則比較第一個字符串。整體比較的結果應該是最後一次不平等比較。 – StoryTeller

+0

你的大括號不匹配。 –

+0

我建議你分開二進制搜索的邏輯和比較兩個房間不同功能的邏輯。這會容易很多。 – jrok

回答

2

像講故事者說的。以下是如何將第二個變量添加到比較中,我會讓你做第三個和第四個。

while (left < right) { 
    mid = left + (right - left)/2; 
    if (name > testVector[mid].getName()) { 
     left = mid+1; 
    } 
    else if (name < testVector[mid].getName()) {           
     right = mid; 
    } 
    else if (initial > testVector[mid].getInitial()) { 
     left = mid+1; 
    } 
    else if (initial < testVector[mid].getInitial()) {           
     right = mid; 
    } 
    ... // third and fourth variables here 
    else {                 
     return true; 
    } 
} 
+0

謝謝你。答案比我想像的要簡單得多。如果有多個&&和||語句,我就會覺得很奇怪或者戲劇性的東西 – user2661167

3

您可以添加operator<到您的類(或cmp功能) 然後使用經典算法。

class A 
{ 
public: 
    // Other stuff 

    bool operator < (const A& rhs) const { 
    if (field1 != rhs.field1) return field1 < rhs.field1; 
    if (field2 != rhs.field2) return field2 < rhs.field2; 
    if (field3 != rhs.field3) return field3 < rhs.field3; 
    return field4 < rhs.field4; 
    } 
private: 
    std::string field1; 
    std::string field2; 
    int field3; 
    int field4; 
};