std::map наличие ключа
От: Аноним  
Дата: 22.03.09 17:03
Оценка:
Как проверить наличие ключа в мапе?
Нужно сделать вроде этого:
if(!myMap.ExistKey(myKey))
{
  myMap[myKey] = myValue;
}
Re: std::map наличие ключа
От: Were  
Дата: 22.03.09 17:19
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Как проверить наличие ключа в мапе?


myMapType::iterator I = myMap.find( myKey );

if ( I != myMap.end())
    I->second = myValue;
Re: std::map наличие ключа
От: Аноним  
Дата: 22.03.09 17:21
Оценка:
Нужно сделать вроде этого:
if(myMap.find(myKey)== myMap.end())
{
  myMap[myKey] = myValue;
}


А еще
if(myMap.insert(MyMapType::value_type(myKey, myValue).second)
{
  //inserted
}
else
{
  //already existed
}
Re[2]: std::map наличие ключа
От: A.Lokotkov Россия  
Дата: 22.03.09 18:56
Оценка:
В смысле, наоборот:
if ( myMap.find( myKey ) == myMap.end() )
  myMap[myKey] = myValue;
bloß it hudla
Re[3]: std::map наличие ключа
От: Were  
Дата: 22.03.09 19:52
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

AL>В смысле, наоборот:

AL>
AL>if ( myMap.find( myKey ) == myMap.end() )
AL>  myMap[myKey] = myValue;
AL>


Точно! )
Re[3]: std::map наличие ключа
От: Vain Россия google.ru
Дата: 22.03.09 22:12
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

AL>В смысле, наоборот:

AL>
AL>if ( myMap.find( myKey ) == myMap.end() )
AL>  myMap[myKey] = myValue;
AL>

Так 2 раза будет искать.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: std::map наличие ключа
От: _DAle_ Беларусь  
Дата: 23.03.09 00:02
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, A.Lokotkov, Вы писали:


AL>>В смысле, наоборот:

AL>>
AL>>if ( myMap.find( myKey ) == myMap.end() )
AL>>  myMap[myKey] = myValue;
AL>>

V>Так 2 раза будет искать.

Да, но зато это в отличие от предыдущей версии делает то, что просил автор топика.
Если нужно, чтобы поиск был только один раз то нужно сделать, как уже сказали раньше, вот так:
myMap.insert(make_pair(myKey, myValue));
Re[5]: std::map наличие ключа
От: Vain Россия google.ru
Дата: 23.03.09 02:34
Оценка:
Здравствуйте, _DAle_, Вы писали:

V>>Так 2 раза будет искать.

_DA>Да, но зато это в отличие от предыдущей версии делает то, что просил автор топика.
Что не так с предыдущей
Автор: Were
Дата: 22.03.09
версией?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[6]: std::map наличие ключа
От: A.Lokotkov Россия  
Дата: 23.03.09 03:31
Оценка:
Здравствуйте, Vain, Вы писали:

V>Что не так с предыдущей
Автор: Were
Дата: 22.03.09
версией?


По условию топик-стартера вставляем, если ключа в мапе нет. В той версии
Автор: Were
Дата: 22.03.09
-- наоборот.
bloß it hudla
Re: std::map наличие ключа
От: Bell Россия  
Дата: 23.03.09 04:17
Оценка: 5 (3) +2
Здравствуйте, Аноним, Вы писали:

Если нужно просто проверить наличие ключа — то можно так:
if(myMap.count(myKey))

главное преимущество — меньше писанины
Любите книгу — источник знаний (с) М.Горький
Re[2]: std::map наличие ключа
От: IROV..  
Дата: 23.03.09 11:20
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


B>Если нужно просто проверить наличие ключа — то можно так:

B>
B>if(myMap.count(myKey))
B>

B>главное преимущество — меньше писанины

главный недостаток, в N раз медленее
я не волшебник, я только учусь!
Re: std::map наличие ключа
От: IROV..  
Дата: 23.03.09 11:31
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>Как проверить наличие ключа в мапе?

А>Нужно сделать вроде этого:
А>
А>if(!myMap.ExistKey(myKey))
А>{
А>  myMap[myKey] = myValue;
А>}
А>


ну вопервых

myMap[myKey] = myValue;

это уже проверит, и вставит.

если нужно "если нету, то вставить".

myMap.insert( std::make_pair( myKey, myValue ) );

если нужно при этом еще и узнать вставило оно или нет то пишем так

bool inserted = myMap.insert( std::make_pair( myKey, myValue ) ).second;

я не волшебник, я только учусь!
Re[2]: std::map наличие ключа
От: A.Lokotkov Россия  
Дата: 23.03.09 11:44
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>ну вопервых

IRO>myMap[myKey] = myValue;
IRO>это уже проверит, и вставит.

если по заданному ключу до вставки лежит очень нужный объект, то он окажется в космосе. хотя, вероятно, топик-стартер этого в виду не имел.
bloß it hudla
Re[3]: std::map наличие ключа
От: IROV..  
Дата: 23.03.09 12:01
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

AL>Здравствуйте, IROV.., Вы писали:


IRO>>ну вопервых

IRO>>myMap[myKey] = myValue;
IRO>>это уже проверит, и вставит.

AL>если по заданному ключу до вставки лежит очень нужный объект, то он окажется в космосе. хотя, вероятно, топик-стартер этого в виду не имел.


да именно, это метод update map
я не волшебник, я только учусь!
Re[3]: std::map наличие ключа
От: Bell Россия  
Дата: 23.03.09 12:54
Оценка:
Здравствуйте, IROV.., Вы писали:

B>>Если нужно просто проверить наличие ключа — то можно так:

B>>
B>>if(myMap.count(myKey))
B>>

B>>главное преимущество — меньше писанины

IRO>главный недостаток, в N раз медленее

Может быть будут аргументы?

ЗЫ
На всякий случай: В табличке 69 в требованиях к сложности стоит логарифм.
Любите книгу — источник знаний (с) М.Горький
Re[4]: std::map наличие ключа
От: IROV..  
Дата: 23.03.09 13:30
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, IROV.., Вы писали:


B>>>Если нужно просто проверить наличие ключа — то можно так:

B>>>
B>>>if(myMap.count(myKey))
B>>>

B>>>главное преимущество — меньше писанины

IRO>>главный недостаток, в N раз медленее

B>Может быть будут аргументы?
Гавно, вопрос.

    size_type count(const key_type& _Keyval) const
        {    // count all elements that match _Keyval
        _Paircc _Ans = equal_range(_Keyval);
        size_type _Num = 0;
        _Distance(_Ans.first, _Ans.second, _Num);
        return (_Num);
        }


что мы тут видем, equal_range -> два find.

Distance!! может для когото секрет, что итерация у std::map это совсем не константная операция.
я не волшебник, я только учусь!
Re[5]: std::map наличие ключа
От: _DAle_ Беларусь  
Дата: 23.03.09 13:37
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Гавно, вопрос.


IRO>
IRO>    size_type count(const key_type& _Keyval) const
IRO>        {    // count all elements that match _Keyval
IRO>        _Paircc _Ans = equal_range(_Keyval);
IRO>        size_type _Num = 0;
IRO>        _Distance(_Ans.first, _Ans.second, _Num);
IRO>        return (_Num);
IRO>        }
IRO>


IRO>что мы тут видем, equal_range -> два find.


IRO>Distance!! может для когото секрет, что итерация у std::map это совсем не константная операция.


Осталось только сказать, что в мэпе всегда в интервале будет максимум один элемент, и никто не запрещал автора реализовать count для map более эффективно.
Re[6]: std::map наличие ключа
От: _DAle_ Беларусь  
Дата: 23.03.09 13:41
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>Здравствуйте, IROV.., Вы писали:


IRO>>Гавно, вопрос.


IRO>>
IRO>>    size_type count(const key_type& _Keyval) const
IRO>>        {    // count all elements that match _Keyval
IRO>>        _Paircc _Ans = equal_range(_Keyval);
IRO>>        size_type _Num = 0;
IRO>>        _Distance(_Ans.first, _Ans.second, _Num);
IRO>>        return (_Num);
IRO>>        }
IRO>>


IRO>>что мы тут видем, equal_range -> два find.


IRO>>Distance!! может для когото секрет, что итерация у std::map это совсем не константная операция.


_DA>Осталось только сказать, что в мэпе всегда в интервале будет максимум один элемент, и никто не запрещал автора реализовать count для map более эффективно.


В stlport это выглядит так:
size_type count(const _KT& __x) const { return _M_t.find(__x) == _M_t.end() ? 0 : 1; }

Ленивые.. А можно ведь сделать лучше.
Re[7]: std::map наличие ключа
От: IROV..  
Дата: 23.03.09 13:47
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>Здравствуйте, _DAle_, Вы писали:


_DA>>Здравствуйте, IROV.., Вы писали:


IRO>>>Гавно, вопрос.


IRO>>>
IRO>>>    size_type count(const key_type& _Keyval) const
IRO>>>        {    // count all elements that match _Keyval
IRO>>>        _Paircc _Ans = equal_range(_Keyval);
IRO>>>        size_type _Num = 0;
IRO>>>        _Distance(_Ans.first, _Ans.second, _Num);
IRO>>>        return (_Num);
IRO>>>        }
IRO>>>


IRO>>>что мы тут видем, equal_range -> два find.


IRO>>>Distance!! может для когото секрет, что итерация у std::map это совсем не константная операция.


_DA>>Осталось только сказать, что в мэпе всегда в интервале будет максимум один элемент, и никто не запрещал автора реализовать count для map более эффективно.

Одна итерация, так одна от begin -> end ^^

начнем с того что сама функция count вообще както глупо выглядит

_DA>В stlport это выглядит так:

_DA>
_DA>size_type count(const _KT& __x) const { return _M_t.find(__x) == _M_t.end() ? 0 : 1; } 
_DA>

_DA>Ленивые.. А можно ведь сделать лучше.
наверное в stl от мелких, идет впервую очередь обощеность кода (минимум), и поэтому база для map и для multimap идет одна, а в stlport просто выжимают соки.

в любом случаее лучше count не пользоватся, как по мне в map это рудимент от multimap
я не волшебник, я только учусь!
Re[8]: std::map наличие ключа
От: _DAle_ Беларусь  
Дата: 23.03.09 13:55
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Одна итерация, так одна от begin -> end ^^


Просто в N раз никакого замедления не будет, максимум в 2 из-за ненужного вызова equal_range.

IRO>начнем с того что сама функция count вообще както глупо выглядит


Согласен, но она делает именно то, что часто надо, хоть и в кривой форме.

_DA>>В stlport это выглядит так:

_DA>>
_DA>>size_type count(const _KT& __x) const { return _M_t.find(__x) == _M_t.end() ? 0 : 1; } 
_DA>>

_DA>>Ленивые.. А можно ведь сделать лучше.
IRO>наверное в stl от мелких, идет впервую очередь обощеность кода (минимум), и поэтому база для map и для multimap идет одна, а в stlport просто выжимают соки.

А кому нужна эта конкретная обобщенность кроме самих разработчиков stl? Мне от stl часто нужна скорость.

IRO>в любом случаее лучше count не пользоватся, как по мне в map это рудимент от multimap
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.