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
Re[9]: std::map наличие ключа
От: IROV..  
Дата: 23.03.09 14:16
Оценка:
Здравствуйте, _DAle_, Вы писали:

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


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

_DA>Просто в N раз никакого замедления не будет, максимум в 2 из-за ненужного вызова equal_range.
2 это тоже N ^^ + хвостик от Distance

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

"Вы просто не умеите их готовить" (с)

count не совсем отображает мысль "есть ли такой обьект", то что мелкие не сделали специализацию под случай Unique Associative Container, ну что я прощаю ^^, я не буду использовать изврат, и надеятся на обьективность.

а как разработчик я только поддержу, меньше кода, меньше багов, и меньше единиц внимания.
я не волшебник, я только учусь!
Re[5]: std::map наличие ключа
От: Bell Россия  
Дата: 24.03.09 03:05
Оценка:
Здравствуйте, IROV.., Вы писали:

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

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.

В случае multimap — да, в случае map — в нормальных реализациях find только один.

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

Да, итерация по дереву не самая дешевая операция, но опять же не для данного случая (т.е. для случая map).

Подводя итог.
Я, в принципе, согласен с аргументами против count, и сам использую find. Но варианты с count приходилось встречать, да и в драфте C++0x этот метод не объявлен как deprecated — так что этот вариант вполне имеет право на жизнь.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.