2015-03-07 2 views
0

Как выглядит y.size() = 4 в следующем? Значения в y равны {11, 2, 4, 7}. Как это получается? Что такое a и b в функции operator() для каждой итерации множества. Я не понимаю конструкции y, и я не могу найти что-либо в Интернете, что объясняет эту ситуацию. Спасибоset constructor с пользовательской функцией сравнения

#include <iostream> 
#include <set> 

struct C 
{ 
    bool operator()(const int &a, const int &b) const 
    { 
     return a % 10 < b % 10; 
    } 
}; 

int main() 
{ 
    std::set<int> x({ 4, 2, 7, 11, 12, 14, 17, 2 }); 
    std::cout << x.size() << std::endl; 
    std::set<int, C> y(x.begin(), x.end()); 
    std::cout << y.size() << std::endl; 
    std::set<int>::iterator iter; 
    for (iter = y.begin(); iter != y.end(); ++iter) 
    { 
     std::cout << *iter << std::endl; 
    } 
    return 0; 
} 

ответ

3

Второй аргумент шаблона из set является тип компаратор - тип функтора, который реализует меньше работы.

struct C 
{ 
    bool operator()(const int &a, const int &b) const 
    { 
     return a % 10 < b % 10; 
    } 
}; 

Этот компаратор сравнивает a и b как a < b только если a % 10 < b % 10, так что практически все числа будут сравниваться по модулю 10.

ОБНОВЛЕНИЕ:

После нажатия на x заданных номеров { 4, 2, 7, 11, 12, 14, 17, 2 }, набор будет содержать семь элементов { 2, 4, 7, 11, 12, 14, 17 }. Эти элементы будут отсортированы таким образом, потому что set хранит объекты отсортированным способом.

Затем номера из x устанавливаются последовательно в набор y. Перед вставкой каждого элемента set найдет подходящее место в отсортированном порядке вставляемых номеров. Если set увидит, что на нем уже есть какой-то номер, set не будет его вставлять.

После вставки {2, 4, 7} от x к y, y будет {2, 4, 7}. Затем, чтобы вставить 11 в yset будет делать сравнения 11 с {2, 4, 7}, чтобы найти подходящее место с помощью предоставленных C функтор. Для того, чтобы проверить, является 11 меньше 2set будет вызывать C()(11, 2), что приведет к 11 % 10 < 2 % 10 сравнения, что приведет к true, поэтому 11 будет вставлен перед 2.

Другие номера из x (12, 14, 17) не будет вставлен, потому что set найдет, что 12 должен быть на месте 2 (потому что 2 % 10 < 12 % 10 or 12 % 10 < 2 % 10 выражение является ложным, так 2 == 12), и таким же образом 14 и 17.

+0

, но какие два значения сравниваются? Как получить значение 11 для первого элемента y? – VarsMolta

+0

@ VarsMolta, потому что 11 mod 10 меньше 2 mod 10, 4 mod 10 и 7 mod 10. – chris

+1

@ VarsMolta Я обновил ответ с подробным объяснением. – rutsky

Смежные вопросы