Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > std::map - нежелательное добавление элемента


Автор: Alca 15.10.2008, 14:12
std::map - нежелательное добавление элемента в контейнер
Код

//---------------------------------------------------------------------------
typedef std::map<std::string, std::string> TStringMap;
//---------------------------------------------------------------------------
TStringMap  g_smDict;
//---------------------------------------------------------------------------
std::string sParamByName(const std::string &csStr) {
     return g_smDict[csStr];
}
//---------------------------------------------------------------------------
main() {
    //g_smDict.size() ---> 0
    std::string sStr = sParamByName("NonExistParam");    //элемент "NonExistParam" в словаре не существует
    //g_smDict.size() ---> 1, т.е. в словарь добавился элемент "NonExistParam" с пустым значением - меня такое не устраивает!!!
}
//---------------------------------------------------------------------------

Как решить эту проблему красиво?

Автор: Daevaorn 15.10.2008, 14:24
А чего вы добиться-то хотите? Какого поведения?

Автор: Alca 15.10.2008, 14:26
Необходимо вернуть из функции элемент словаря (если элемента нет, то в словарь ничего не должно добавляться).

Автор: Lazin 15.10.2008, 14:33
Цитата(Alca @  15.10.2008,  14:26 Найти цитируемый пост)
Необходимо вернуть из функции элемент словаря (если элемента нет, то в словарь ничего не должно добавляться).

а что в этом случае должна вернуть функция?
что-бы элемент не добавлялся, нужно использовать метод find

Код

TStringMap::iterator iter = g_smDict.find(key);
if (iter == TStringMap.end())
    throw "key not found";
return iter->second;

Автор: vinick 15.10.2008, 14:35
Код

std::string sParamByName(const std::string &csStr) {
     TStringMap::iterator p = g_smDict.find(csStr);
     return (p == g_smDict.end()) ? throw std::runtime_error("not found") : p->second;

}

вроде  только так.

Автор: Любитель 15.10.2008, 14:53
Цитата(vinick @  15.10.2008,  14:35 Найти цитируемый пост)
return (p == g_smDict.end()) ? throw std::runtime_error("not found") : p->second;

А это разве скомпилится?!

Автор: Alek86 15.10.2008, 15:11
угу
хотя странно
вот это не компилится

Код
void F(int);

int main() {
 F(throw 1);
}

Автор: Любитель 15.10.2008, 15:13
Офигеть smile 

Автор: vinick 15.10.2008, 15:50
Цитата(Alek86 @  15.10.2008,  15:11 Найти цитируемый пост)
угу
хотя странно

ничего странного 
5.16.2
Цитата

If either the second or the third operand has type (possibly cv-qualified) void, then the lvalue-to-rvalue
(4.1), array-to-pointer (4.2), and function-to-pointer (4.3) standard conversions are performed on the second
and third operands, and one of the following shall hold:
— The second or the third operand (but not both) is a throw-expression (15.1); the result is of the type of
    the other and is an rvalue.
— Both the second and the third operands have type void; the result is of type void and is an rvalue.
    [Note: this includes the case where both operands are throw-expressions. ]


Автор: Lazin 15.10.2008, 15:57
кто то 2 раза плюсанул мой пост, в котором есть ошибка smile 

Код

TStringMap::iterator iter = g_smDict.find(key);
if (iter == g_smDict.end())
    throw "key not found";
return iter->second;

Автор: Alca 15.10.2008, 16:28
Цитата

TStringMap::iterator iter = g_smDict.find(key);
if (iter == g_smDict.end())
    throw "key not found";
return iter->second;

Цитата

---------------------------
ConsoleTest.exe - Ошибка приложения
---------------------------
Исключение unknown software exception (0x40000015) в приложении по адресу 0x00408d19.


"ОК" -- завершение приложения
"Отмена" -- отладка приложения
---------------------------
ОК   Отмена   
---------------------------

Автор: Daevaorn 15.10.2008, 16:30
Alca, ну вот, значит сработало.

Автор: Alca 15.10.2008, 16:34
Типа так?
Код

std::string sParamByName(const std::string &csStr) {
    TStringMap::iterator iter = g_smDict.find(csStr);
    if (iter == m_g_smDict.end()) {
        //throw "key not found";
        return "";
    } else {
        return iter->second;    
    }
}

Автор: Любитель 15.10.2008, 19:10
У тебя ж спросили:
Цитата(Lazin @  15.10.2008,  14:33 Найти цитируемый пост)
а что в этом случае должна вернуть функция?


Автор: Alca 15.10.2008, 21:20
Любитель,  ап

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)