2013-10-01 7 views
0

Так что я выполняю задание, и мне нужно искать вектор для объекта с 4 переменными. строка, строка, int, int. Я довольно новичок в программировании. Я получил двоичный serach для работы, если я только поиск с использованием первой строки. Но не уверен, как сделать его совпадением со всеми четырьмя полями.C++ Бинарный поиск с несколькими условиями вектора

вектор сортируется по первой строке, если первый матч строка сортируется по второй строке, если второй матч строка сортируется, но первый ИНТ и т.д.

Пока мой код

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

Спасибо за это. Ответ был намного проще, чем я себе представлял. Я думал о огромных ошибках if с mutiple && и || или что-то драматическое. – 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; 
}; 
Смежные вопросы