Подскажите пожалуйста: переделывал стандартный пример из Трельсена, ввел поле ID. Хотелось бы чтобы элемент коллекции удалялся не с определенными номером, а шел поиск по ID и элемент с нужным ID удалялся. Вот листинг самой функции удаления. Как мне сделать цикл по всем элементам? (я ввел для элемента функцию get_obj, котора одним из параметров выдает этот ID).
STDMETHODIMP CSquiggleCollection2::Remove(long index)
{
// Be sure we are in range.
if(index >=0 && index <= m_vecSquiggles.size())
{
// Find the correct squiggle.
IDispatch* pDisp = m_vecSquiggles[index];
// Remove it.
pDisp->Release();
m_vecSquiggles.erase(m_vecSquiggles.begin() + index);
return S_OK;
}
return E_FAIL;
}
Здравствуйте, vitaly_spb, Вы писали:
_>Подскажите пожалуйста: переделывал стандартный пример из Трельсена, ввел поле ID. Хотелось бы чтобы элемент коллекции удалялся не с определенными номером, а шел поиск по ID и элемент с нужным ID удалялся. Вот листинг самой функции удаления. Как мне сделать цикл по всем элементам? (я ввел для элемента функцию get_obj, котора одним из параметров выдает этот ID).
В качестве элемента вектора заводишь структуру
struct _item
{
IDispatch* pDisp;
long lId;
};
Удаление:
STDMETHODIMP CSquiggleCollection2::Remove(long lId)
{
// Be sure we are in range.
for(int i = 0; i < m_vecSquiggles.size();i++)
{
// Find the correct squiggle.
if (m_vecSquiggles[i].lId == lId){
IDispatch* pDisp = m_vecSquiggles[i];
pDisp->Release();
m_vecSquiggles.erase(m_vecSquiggles.begin() + i);
return S_OK;
}
}
return E_FAIL;
}
Это нужно еще Advise немного переделать.
А вообще, такие вещи на map'е делать — самое то!
AS>В качестве элемента вектора заводишь структуру
AS>AS>struct _item
AS>{
AS> IDispatch* pDisp;
AS> long lId;
AS>};
AS>
AS>Удаление:
AS>AS>STDMETHODIMP CSquiggleCollection2::Remove(long lId)
AS>{
AS> // Be sure we are in range.
AS> for(int i = 0; i < m_vecSquiggles.size();i++)
AS> {
AS> // Find the correct squiggle.
AS> if (m_vecSquiggles[i].lId == lId){
AS> IDispatch* pDisp = m_vecSquiggles[i];
AS> pDisp->Release();
AS> m_vecSquiggles.erase(m_vecSquiggles.begin() + i);
AS> return S_OK;
AS> }
AS> }
AS> return E_FAIL;
AS>}
AS>
Честно говоря, мне не очень понятно: как lId согласовывается с моим ID у элемента?
AS>Это нужно еще Advise немного переделать.
А это что значит?
AS>А вообще, такие вещи на map'е делать — самое то! 
С радостью, может подскажешь как сделать это же с помощью map?
Здравствуйте, vitaly_spb, Вы писали:
[]
AS>>Это нужно еще Advise немного переделать.
_>А это что значит?
Это значит, что я загнался.

Имелось в виду Add — добавление объекта.
AS>>А вообще, такие вещи на map'е делать — самое то!
_>С радостью, может подскажешь как сделать это же с помощью map?
std::map<long,LPDISPATCH> m_map;
HRESULT Add(LPDISPATCH pDisp,long lId)
{
m_map[lId] = pDisp;
pDisp->AddRef();
}
HRESULT Remove(long lId)
{
std::map<long,LPDISPATCH>::iterator ItemInMap = m_map.find(lId);
if (ItemInMap != m_map.end()){
ItemInMap->second->Release();
m_map.erase(ItemInMap);
}
}
HRESULT RemoveByNum(long idx)
{
std::map<long,LPDISPATCH>::iterator ItemInMap = m_map.begin();
std::advance(ItemInMap,idx);
ItemInMap->second->Release();
m_map.erase(ItemInMap);
}
HRESULT RemoveByRef(LPDISPATCH pDisp)
{
//тут перечислением находишь элемент и убиваешь его как в примерах выше.
}
Обработка ошибок опущена, пример писал "на коленках".