C ++ с использованием std :: накапливать для создания карты - PullRequest
1 голос
/ 24 марта 2012

У меня проблема с созданием std::map<int, int> из вектора указателей, который называется files. Каждый указатель указывает на объект с тремя переменными-членами, одна из которых size типа int. Ключом карты будет size, а значением будет количество объектов с одинаковым size.

НЕ тратьте свое время на второй! Это следующий шаг в моей программе, и я уже понял это, я думаю. Для инициализации карты я использую std::accumulate, потому что она возвращает значение. Я использую std::tr1::shared_ptr для указателей и лямбда-выражения для функции предиката. У меня проблемы с компиляцией.

Вот фрагмент кода:

map<int,int>* sizes = new map<int,int>();
sizes = accumulate(files.begin(), files.end(),sizes,
[&sizes](map<int,int> acc, shared_ptr<CFileType>& obj)
{
    return sizes->insert(pair<int,int>(obj->getSize(),0));
});

Вот ошибка:

ошибка C2664: 'std :: pair <_Ty1, _Ty2> `anonymous-namespace' :::: operator () (std :: map <_Kty, _Ty>, std :: tr1 :: shared_ptr &) const ' : невозможно преобразовать параметр 1 из 'std :: map <_Kty, _Ty>' в 'std :: map <_Kty, _Ty>'

Я не очень уверен, что перейти к лямбда-функции. Я пробовал с pair<int, int>, но это не сработало. Также я должен упомянуть, что эта карта возвращается другой функции, поэтому она должна быть указателем.

Любая помощь от вас будет оценена. Спасибо!


UPDATE:

Проблема решена, вот решение:

map<int,int>* sizes = accumulate(files.begin(), files.end(), new map<int,int>(),
    [](map<int,int>* acc, shared_ptr<CFileType>& obj)->map<int,int>*
    {
        acc->insert(pair<int,int>(obj->getSize(),0));
        return acc;
    });

1 Ответ

2 голосов
/ 24 марта 2012

Сообщение об ошибке состоит в том, что у вас есть несоответствие типов между двумя типами std::map с. Похоже, что ошибка в коде, который вызывает лямбду, которая явно пропускает неправильное значение для параметра acc. Хорошая новость заключается в том, что лямбда, как сообщается, никогда не использует параметр acc.

...