Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Специфичная реализация for each для std::map 
V
    Опции темы
RastaDja
Дата 29.11.2010, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Здравствуйте!
Есть задача реализовать for each для std::map.
Но задача специфична: то-есть, как известно (или я чегото не знаю) _NewEnum может вернуть нам коллекцию либо данных, либо ключей. Но мне надо, в зависимости от задачи, вернуть имена коллекции, или данные. 

я смог реализовать
Код

For each a in coll
    msgbox a
Next
Код




соответственно кодом
Код

STDMETHODIMP CVDS::get__NewEnum(LPUNKNOWN* pVal)
{
    //    возвращаем данные
    int size = m_varMap.size();
    VARIANT *pVari = new VARIANT[size];
    map<CComBSTR, CComVariant>::iterator it;
    int i;
    for (it = m_varMap.begin(), i = 0; it != m_varMap.end(); ++it, ++i){
        pVari[i] = it->second;
    }
    
    typedef CComObject< CComEnum< IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > > enumVar;
    enumVar* pEnumVar = new enumVar;
    pEnumVar->Init(&pVari[0], &pVari[size], NULL, AtlFlagCopy);
    delete [] pVari;

    return pEnumVar->QueryInterface(IID_IUnknown, (void**)pVal);
}


но неудобство в том, что тут я возвращаю только данные, а если заменить соответственный код на 
Код

for (it = m_varMap.begin(), i = 0; it != m_varMap.end(); ++it, ++i){
        pVari[i].vt = VT_BSTR;
        pVari[i].bstrVal = it->first;
    }


то верну только имена


как мне реализовать чтото вроди
Код

For each a in coll
    msgbox a.key ,, a.value
Next


или же чтото вроди 
Код

For each a in coll.names
    msgbox a
Next


Или же для мап есть специфичная конструкция для for each
спасибо!


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 30.11.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



ХЕЛП, нможет кто знает как std::map вывести?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 30.11.2010, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



навалял такую реализацию этого:
1. создал новый класс (Class2) с коллекцией std::map  c именем m_Map
2. реализовал в Class2 свойство _NewEnum
3. в своем классе создал свойство Key
Код

STDMETHODIMP CVDS::get_Key(IClass2** pVal)
{
    // TODO: Add your implementation code here
    CComObject< Class2  >* cColl;
    CComObject< Class2 >::CreateInstance(&cColl);
    
    std::copy(m_varMap.begin(), m_varMap.end(), std::inserter(cColl->m_Map, cColl->m_Map.begin()));

    cColl->QueryInterface(IID_IClass2, (void**)pVal);
    return S_OK;
}


это позволило реализовать такой код
1. вывод данных
Код

 For Each z In mColl
        MsgBox z
 Next

2. вывод имен
Код

 For Each z In mColl.Key
        MsgBox z
 Next


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


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 30.11.2010, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Лучше сделайте свой класс для элементов enum'а. класс из 2х полей - ключ и значение. Тогда foreach можно будет делать сразу и для ключа и для значения
Код

For Each z In mColl
        MsgBox z.Key
        MsgBox z.Value
 Next


PM MAIL   Вверх
RastaDja
Дата 30.11.2010, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



ща попробую, а клас ATL, или простой?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 30.11.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @ 30.11.2010,  13:51)
ща попробую, а клас ATL, или простой?

ATL, dual

PM MAIL   Вверх
RastaDja
Дата 30.11.2010, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



всё сделал smile  smile 
но вот та же проблема. клас для Key Value высвечивается в библиотеке, как его скрить, или это невозможно?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 30.11.2010, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Цитата

как его скрить, или это невозможно? 

hidden


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0816 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.