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


Автор: Step 20.9.2004, 13:13
есть класс
Код

typedef struct tagPROCESSENTRY32 {
 DWORD dwSize;
 DWORD cntUsage;
 DWORD th32ProcessID;
 ULONG_PTR th32DefaultHeapID;
 DWORD th32ModuleID;
 DWORD cntThreads;
 DWORD th32ParentProcessID;
 LONG  pcPriClassBase;
 DWORD dwFlags;
 TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32;


Код

class CProcitem
{

public:
PROCESSENTRY32 info;
HTREEITEM item;
CProcitem(void);
CProcitem(PROCESSENTRY32 info,HTREEITEM item);
~CProcitem(void);
};

Код

map<CString, CProcitem> proc_arr;
typedef map<CString, CProcitem>::value_type varType2;
map<CString, CProcitem>::iterator it2;



как найти запись по значению info.th32ProcessID

Автор: DENNN 20.9.2004, 14:30
перебором всех занчений, содержащихся в map/

Автор: mr.DUDA 20.9.2004, 14:34
Раз у тебя "info" лежит не в ключе, а в значении, то используй STL-овский алгоритм "find_if", перебирающий все value_type-элементы контейнера, с передачей в пользовательскую функцию (предикат). Сравниваемое значение нужно определить где-нибудь вне предиката. Того же результата можно добиться обычным перебором всех значений мапа в цикле for.
Код
#include <map>
#include <algorithm>

using namespace std;

typedef map<CString, CProcitem> MapProcArr;

// .....


DWORD lookUpProcessId = 0;

bool compare_func(const MapProcArr::value_type &val)
{
return val.second.info.th32ProcessID == lookUpProcessId;
}


void Test()
{
MapProcArr proc_arr;

lookUpProcessId = 123;
find_if(proc_arr.begin(), proc_arr.end(), compare_func);
}

Автор: Step 20.9.2004, 14:35
Cпасибо

Автор: Step 20.9.2004, 14:50
ошибка
term does not evaluate to a function

A call is made to a function through an expression. The expression does not evaluate to a function pointer. The following sample generates C2064:

Добавлено @ 14:52
ошибка
term does not evaluate to a function

A call is made to a function through an expression. The expression does not evaluate to a function pointer. The following sample generates C2064:

Автор: Олег М 21.9.2004, 11:11
Попробуй так
Код

typedef std::map<CString, CProcitem> MapProcArr;

struct _equal_pid : public std::binary_function<MapProcArr::value_type, DWORD, bool>
{ bool operator () (const MapProcArr::value_type &val, DWORD id) const {return val.second.info.th32ProcessID==id;} };

........................

MapProcArr proc_arr;
MapProcArr::iterator it=std::find_if(proc_arr.begin(),proc_arr.end(),std::binder2nd<_equal_pid>(_equal_pid(),100));

Автор: Step 21.9.2004, 11:38
Всем большое спасибо... все заработало...

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