Возврат самого большого ключа строго меньше, чем данный ключ в Карте C++

Просто чтобы добавить ко всему этому что-то очень мало, а остальные, скорее всего, не знали.

Если вы работаете с изображениями, вы можете предпочесть не используйте предубеждение вообще. В теории, таким образом, ваша сеть будет более независимой от величины данных, как в том, является ли изображение темным, ярким и ярким. И сеть собирается научиться выполнять эту работу путем изучения относительности внутри ваших данных. Многие современные нейронные сети используют это.

Для других данных, имеющих предубеждения, может быть критическим. Это зависит от того, с какими данными вы имеете дело. Если ваша информация является величиной-инвариантной --- если ввод [1,0,0.1] должен привести к такому же результату, как если бы вы ввели [100,0,10], вам может быть лучше без смещения.

25
задан kal 9 February 2009 в 20:52
поделиться

4 ответа

Да, lower_bound может использоваться для этого, я видел его прежде и использовал его как этот.

map_type::iterator it = map.lower_bound(2.3);
if(it != map.begin()) {
    --it;
    // it now points at the right element
}

на самом деле возвратил бы самое большое, еще меньшее (если это! = map.begin () было верно), один. Если это было в .begin, то нет никакого меньшего ключа. Хорошая идея из комментариев состоит в том, чтобы возвратиться .end, если нет никакого элемента, который это меньше, и упакуйте этот материал в функцию:

template<typename Map> typename Map::const_iterator 
greatest_less(Map const& m, typename Map::key_type const& k) {
    typename Map::const_iterator it = m.lower_bound(k);
    if(it != m.begin()) {
        return --it;
    }
    return m.end();
}

template<typename Map> typename Map::iterator 
greatest_less(Map & m, typename Map::key_type const& k) {
    typename Map::iterator it = m.lower_bound(k);
    if(it != m.begin()) {
        return --it;
    }
    return m.end();
}

шаблон должен работать на std::set также.

21
ответ дан Johannes Schaub - litb 28 November 2019 в 21:37
поделиться

Если Вы не заботитесь об упорядочивании, можно использовать карту:: upper_bound для получения элемента, который Вы хотите, но необходимо определить класс сопоставления со станд.:: больше для аргумента черт, так, чтобы упорядочивание было высоко-к-низкому.

typedef std::map<double,MyClass,std::greater<double> > MyMap;
MyMap myMap;
myMap[1.5] = value1;
myMap[2.0] = value2;
myMap[3.0] = value3;

MyMap::iterator elt = myMap.upper_bound(2.5); // should be pair(2.0,value2)
7
ответ дан KenE 28 November 2019 в 21:37
поделиться

Ваш метод будет работать, но необходимо проверить, чтобы удостовериться, что Вы не отступаете за начало карты. Плюс Вы нужен lower_bound, не upper_bound.

iterator = map.lower_bound(2.3)
if (iterator != map.begin())
    --iterator;
3
ответ дан Mark Ransom 28 November 2019 в 21:37
поделиться

Я использовал бы станд.:: find_if () с обратными итераторами, чем-то как:

find_if( map.rbegin(), map.rend(), is_less_than );

необходимо будет определить is_less_than () функция предиката.

(cf. http://www.cplusplus.com/reference/algorithm/find_if.html )

1
ответ дан Rob K 28 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: