станд.:: значение по умолчанию карты

Вы читали JavaDoc of Agenda?

http://jfxtras.org/doc/8.0/jfxtras-agenda/jfxtras/scene/control/agenda/Agenda.html

Повестка дня имеет всплывающее окно по умолчанию, позволяющее редактировать основные свойства встреч, но, возможно, вы захотите что-то сделать сами. Если это так, вам нужно зарегистрироваться в editAppointmentCallback и открыть свое собственное всплывающее окно. Поскольку Повестка дня не диктует механизм события / обратного вызова при реализации Назначения, она не может быть проинформирована об изменениях в назначении. Поэтому, когда пользовательское редактирование завершено, убедитесь, что повестка дня обновляется, вызывая refresh ().

76
задан Sergey K. 14 February 2014 в 15:38
поделиться

5 ответов

Нет, нет. Самое простое решение - написать для этого собственную бесплатную функцию-шаблон. Что-то вроде:

#include <string>
#include <map>
using namespace std;

template <typename K, typename V>
V GetWithDef(const  std::map <K,V> & m, const K & key, const V & defval ) {
   typename std::map<K,V>::const_iterator it = m.find( key );
   if ( it == m.end() ) {
      return defval;
   }
   else {
      return it->second;
   }
}

int main() {
   map <string,int> x;
   ...
   int i = GetWithDef( x, string("foo"), 42 );
}

Обновление C ++ 11

Цель: учет общих ассоциативных контейнеров, а также необязательных параметров компаратора и распределителя.

template <template<class,class,class...> class C, typename K, typename V, typename... Args>
V GetWithDef(const C<K,V,Args...>& m, K const& key, const V & defval)
{
    typename C<K,V,Args...>::const_iterator it = m.find( key );
    if (it == m.end())
        return defval;
    return it->second;
}
44
ответ дан 24 November 2019 в 11:21
поделиться

Используйте std::map::insert().

Понимание, что я довольно опаздываю этой стороне, но если Вы интересуетесь поведением operator[] с пользовательскими значениями по умолчанию (то есть, найдите элемент с данным ключом, если это не существующее , вставляют элемент в карту с выбранным значением по умолчанию и возвращают ссылку или на недавно вставленное значение или на существующее значение), уже существует функция, доступная Вам пред C++ 17: std::map::insert(). insert на самом деле не вставит, если ключ уже будет существовать, но вместо этого возвратите итератор существующему значению.

Говорят, Вы хотели карту строки к интервалу и вставляете значение по умолчанию 42, если ключ еще не присутствовал:

std::map<std::string, int> answers;

int count_answers( const std::string &question)
{
    auto  &value = answers.insert( {question, 42}).first->second;
    return ++value;
}

int main() {

    std::cout << count_answers( "Life, the universe and everything") << '\n';
    std::cout << count_answers( "Life, the universe and everything") << '\n';
    std::cout << count_answers( "Life, the universe and everything") << '\n';
    return 0;
}

, который должен произвести 42, 43 и 44.

, Если стоимость построения значения карты высока (если или копирование/перемещение ключа или тип значения являются дорогими), это прибывает в значительную потерю производительности, которая я думаю, обошелся бы с 17 C++ try_emplace.

0
ответ дан 24 November 2019 в 11:21
поделиться

Стандарт C++ (23.3.1.2) указывает, что вновь вставленное значение строится по умолчанию, поэтому map сам по себе не предоставляет способа сделать это. Ваши варианты:

  • Дать типу значения конструктор по умолчанию, который инициализирует его нужным вам значением, или
  • Обернуть map в собственный класс, который предоставляет значение по умолчанию и реализует operator[] для вставки этого значения по умолчанию.
11
ответ дан 24 November 2019 в 11:21
поделиться

Возможно, вы можете дать пользовательский аллокатор, который выделяет с нужным вам значением по умолчанию.

template < class Key, class T, class Compare = less<Key>,
       class Allocator = allocator<pair<const Key,T> > > class map;
1
ответ дан 24 November 2019 в 11:21
поделиться

Невозможно указать значение по умолчанию - это всегда значение, созданное по умолчанию (конструктор нулевого параметра).

На самом деле operator [] , вероятно, делает больше, чем вы ожидаете, поскольку если значение не существует для данного ключа на карте, он вставит новое значение со значением из конструктора по умолчанию.

4
ответ дан 24 November 2019 в 11:21
поделиться
Другие вопросы по тегам:

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