test vector's back method

本文介绍了一个使用C++实现的简单示例,演示了如何利用STL容器vector的back()方法来实现任务队列的功能。具体包括vector的填充、利用back()方法获取最后一个元素并移除,最终完成了对下载任务队列的模拟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/// @file       TestConsole.cpp
/// @brief      验证vector's back() 方法

#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <string>
#include <vector>

#ifndef SIZE_OF_WCHAR_ARR
#define SIZE_OF_WCHAR_ARR(x) (sizeof(x) / sizeof(WCHAR))
#endif

#ifndef SAFE_DELETE
#define SAFE_DELETE(p) \
    if (NULL != p) \
    { \
        delete []p; \
        p = NULL; \
    }
#endif

typedef struct _tag_info
{
    LONGLONG    llId;
    WCHAR       cName[MAX_PATH];

    _tag_info()
    {
        llId = -1;
        ::ZeroMemory(cName, sizeof(cName));
    }
}TAG_INFO;

typedef std::vector<TAG_INFO *> VEC_INFO;

void LockList();
void UnLockList();
std::wstring StringFormatV(WCHAR * szFormat, ...);
void DoTask(TAG_INFO * pInfo);
void fnTest();

int _tmain(int argc, _TCHAR* argv[])
{
    fnTest();
    _tprintf(L"\r\nEND, press anykey to quit\r\n");

    /// run result
    /**
    vecInfo.size() = 9
    pInfo->llId = 8, pInfo->cName = "llId = 8"
    pInfo->llId = 7, pInfo->cName = "llId = 7"
    pInfo->llId = 6, pInfo->cName = "llId = 6"
    pInfo->llId = 5, pInfo->cName = "llId = 5"
    pInfo->llId = 4, pInfo->cName = "llId = 4"
    pInfo->llId = 3, pInfo->cName = "llId = 3"
    pInfo->llId = 2, pInfo->cName = "llId = 2"
    pInfo->llId = 1, pInfo->cName = "llId = 1"
    pInfo->llId = 0, pInfo->cName = "llId = 0"

    END, press anykey to quit
    */
    getwchar();
    return 0;
}

void fnTest()
{
    BOOL                bDlTaskOver = FALSE; ///< 下载任务完成
    size_t              nIndex = 0;
    TAG_INFO *          pInfo = NULL;
    VEC_INFO            vecInfo;

    // fill data to vector
    for (nIndex = 0; nIndex < 9; nIndex++)
    {
        pInfo = new TAG_INFO;
        _ASSERT(NULL != pInfo);

        pInfo->llId = nIndex;
        _tcscpy_s(
            pInfo->cName, 
            SIZE_OF_WCHAR_ARR(pInfo->cName), 
            StringFormatV(L"llId = %d", pInfo->llId).c_str());

        vecInfo.push_back(pInfo);
    }

    // 用在一个简单下载任务队列, 下载任务不分先后, 用vector自带的后进先出功能
    // 如果要先进先出的话, 用 deque's push_back() + front() + pop_front()

    // 从vector中取出任务, 干活
    _tprintf(L"vecInfo.size() = %d\r\n", vecInfo.size());
    while (!bDlTaskOver)
    {
        // 用vector的back方法,可以省去用 vector::iterator
        bDlTaskOver = FALSE;
        LockList();
        if (vecInfo.size() > 0)
        {
            pInfo = vecInfo.back();
            vecInfo.pop_back();
        }
        else
        {
            bDlTaskOver = TRUE;
        }

        UnLockList();
        DoTask(pInfo);
        SAFE_DELETE(pInfo);
    }
}

std::wstring StringFormatV(WCHAR * szFormat, ...)
{//入参为格式化的参数列表
    size_t          nStrLen     =   0;
    WCHAR *       pBufMsg     =   NULL;
    std::wstring    strRc;
    va_list         args;

    va_start(args, szFormat);

    nStrLen = _vsntprintf(NULL, 0, szFormat, args);

    pBufMsg = new WCHAR[nStrLen + 1];
    _ASSERT(pBufMsg);
    ::ZeroMemory(pBufMsg, (nStrLen + 1) * sizeof(WCHAR));

    nStrLen = _vsntprintf(pBufMsg, nStrLen, szFormat, args);
    va_end(args);

    strRc = pBufMsg;

    delete []pBufMsg;
    pBufMsg = NULL;

    return strRc;
}

void LockList()
{
    /// @todo
}

void UnLockList()
{
    /// @todo
}

void DoTask(TAG_INFO * pInfo)
{
    if (NULL != pInfo)
    {
        _tprintf(L"pInfo->llId = %I64d, pInfo->cName = \"%s\"\r\n",
            pInfo->llId,
            pInfo->cName);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值