• 【原创】STL之链表学习笔记

    2008-12-27

    分类:数据结构

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://nokyo.blogbus.com/logs/33026051.html

        STL(Standard Template Library,标准模板库)是一种很有用的东西,自从认识了STL,我再也不用为自己的数据结构太差而感到忧心忡忡了,哈哈。

        STL非常良好地封装了常见的数据结构操作,例如向量、链表等东西,而且效率很高(废话~),多数情况下我们只要拿来就用就行了,而且不同的对象使用方法都大抵相同,很好用。

        下面这个演示程序就是我为了学习使用STL的链表而写的演示程序,在程序中我把获取到的进程信息放入一个链表里面,看起来没啥用,不过这是演示用的,不要苛求了。

    #include "windows.h"
    #include "stdio.h"
    #include "Psapi.h"

    #pragma comment(lib,"psapi.lib")

    // 使用链表所要包含的头文件
    #include "list"
    using namespace std;

    // 变量定义
    typedef struct _PROCESS_INFO{
        UINT nPid;
        char lpFilePath[MAX_PATH];
    }PROCESS_INFO, *PPROCESS_INFO;

    typedef list<PROCESS_INFO> ProcessList;
    typedef ProcessList::iterator ITERATOR;

    // 函数声明
    int EnumProcess(ProcessList &List);

    // 主函数
    void main()
    {
        ProcessList List;
        EnumProcess(List);
        printf("%d\n", List.size());

        // 输出结果
        ITERATOR iter = List.begin();
        for ( ; iter != List.end(); iter++)
        {
             printf("\n(%d)\t    %s\n", (*iter).nPid, (*iter).lpFilePath);
        }
    }

    int EnumProcess(ProcessList &List)
    {
        PROCESS_INFO pi;
        DWORD ProcessCount;
        DWORD cbNeeded;
        DWORD ProcessId[1024];
     
        EnumProcesses(ProcessId,sizeof(ProcessId),&cbNeeded);
        ProcessCount = cbNeeded/sizeof(DWORD);
     
        HMODULE hModule;
        char    szPath[MAX_PATH];
       
        for(DWORD i = 0; i < ProcessCount; i ++)
        {
            memset(szPath,0,sizeof(szPath));

            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,ProcessId[i]);
            memset(szPath,0,sizeof(szPath));
      
            if(hProcess)
            {
                EnumProcessModules(hProcess,&hModule,sizeof(hModule),&cbNeeded);
                GetModuleFileNameEx(hProcess,hModule,szPath,sizeof(szPath));
       
                if(ProcessId[i] == 4)
                {
                     sprintf(szPath,"System");
                }
       
                // 添加入链表结尾
                pi.nPid = ProcessId[i];
                strcpy(pi.lpFilePath, szPath);

                List.push_back(pi);
            } 
            CloseHandle(hProcess);
        }

        return ProcessCount;
    }





    评论

  • 你还是没有说清楚,到底哪个函数是STL里的,
    我们ACM时候自己写的时候自己写可以STL,但是比赛不让用,
    好在小爷我也不玩ACM了
  • 哈哈....挺有意思