Помогите с помощью MFC CMap (или std :: map) пожалуйста - PullRequest
0 голосов
/ 31 августа 2010

a C++ нуб здесь.Я пытаюсь настроить некоторый код, используя следующие строки key (это означает, что они не единственные, но единственные, которые должны иметь значение для этого вопроса).Кстати, я использую компилятор Visual Studio 2010 C ++ для Windows.

CMap<ATL::CAtlString,LPCTSTR,UINT,UINT> mapForDuplicates; // "dict" definition
ATL::CAtlString strDescription = ... // let's just say it gets set to a value.
UINT nFound = 0; // What is this for???
BOOL bFound = mapForDuplicates.Lookup(strDescription, nFound);
mapForDuplicates[strDescription] = 1;

Теперь ... Я действительно не хочу использовать UINT здесь, так как bool это все, что мне действительно нужно,Однако я не мог понять, каковы все аргументы для конструктора CMap.При использовании C# все, что мне нужно указать, это тип ключа и тип значения.Тот факт, что ATL::CAtlString не соответствует LPCSTR, действительно смущает меня.Что такое KEY, ARG_KEY, VALUE и ARG_VALUE?Зачем мне все четыре и могут ли все четыре отличаться?Спасибо.

...
template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
class CMap : public CObject
...

Примечание: я мог бы вместо этого использовать std::map (хотя я также не использовал его);единственная не подлежащая обсуждению ATL::CAtlString - я должен использовать этот тип.Дайте мне знать, если у вас есть вопросы.

Ответы [ 3 ]

1 голос
/ 31 августа 2010

IIRC есть четыре аргумента шаблона, так что вы можете добавить один тип и получить другой (const) тип обратно. Здесь он добавляет CAtlStrings, но возвращает LPCTSTR. Часто вы просто указываете то же самое для типов дважды (например, int, int, float, float для карты целых чисел -> float).

Грр, этот дополнительный L действительно меня раздражает в наши дни, он был великолепен для 16-битной Windows, но сейчас ... PCSTR - это все, что нужно «L» - бесполезное приложение для программирования Windows.

nFound - это то, что выходит из карты, карта отображается в UINT, поэтому nFound - это UINT.

1 голос
/ 31 августа 2010

Начните с документов для класса = - здесь также есть ссылка на образец

http://msdn.microsoft.com/en-us/library/s897094z(VS.71).aspx

0 голосов
/ 01 сентября 2010

Кстати, следующий псевдо-образец помог мне.

std::set<CAtlString> setOfDescriptions;
for each(...)
{
    CAtlString strDescription = GetDescription();
    if (setOfDescriptions.find(strDescription) != setOfDescriptions.end())
    {
        // Remove a duplicate.
    }

    setOfDescriptions.insert(strDescription); // Mark as seen.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...