test deque's front method

本文通过一个简单的下载任务队列示例,展示了如何使用C++ STL中的deque容器的front方法来实现先进先出的任务调度机制。

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

/// @file       TestConsole.cpp
/// @brief      验证deque's front() 方法

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

#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::deque<TAG_INFO *> DEQ_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
    /**
    deqInfo.size() = 9
    pInfo->llId = 0, pInfo->cName = "llId = 0"
    pInfo->llId = 1, pInfo->cName = "llId = 1"
    pInfo->llId = 2, pInfo->cName = "llId = 2"
    pInfo->llId = 3, pInfo->cName = "llId = 3"
    pInfo->llId = 4, pInfo->cName = "llId = 4"
    pInfo->llId = 5, pInfo->cName = "llId = 5"
    pInfo->llId = 6, pInfo->cName = "llId = 6"
    pInfo->llId = 7, pInfo->cName = "llId = 7"
    pInfo->llId = 8, pInfo->cName = "llId = 8"

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

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

    // fill data to deque
    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());

        deqInfo.push_back(pInfo);
    }

    // 用在一个简单下载任务队列, 下载任务执行分先后, 先压入队列的任务,先执行
    // 用deque自带的push_back() + front() + pop_front()

    // 从deque中取出任务, 干活
    _tprintf(L"deqInfo.size() = %d\r\n", deqInfo.size());
    while (!bDlTaskOver)
    {
        // 用deque的front方法,可以省去用 vector::iterator
        bDlTaskOver = FALSE;
        LockList();
        if (deqInfo.size() > 0)
        {
            pInfo = deqInfo.front();
            deqInfo.pop_front();
        }
        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);
    }
}


题目描述 现有一个空整数序列 A = ( ) A=()。你需要按顺序处理 Q Q个查询操作,查询分为两种类型: 类型 1 1:格式为1 c x。将 c c个 x x添加到 A A的末尾。 类型 2 2:格式为2 k。从 A A中移除前 k k个元素,并输出被移除的 k k个整数之和。保证此时序列长度不小于 k k。 约束条件 1 ≤ Q ≤ 2 × 10 5 1≤Q≤2×10 5 在类型 1 1查询中, 1 ≤ c ≤ 10 9 1≤c≤10 9 在类型 1 1查询中, 1 ≤ x ≤ 10 9 1≤x≤10 9 在类型 2 2查询中,设此时 A A的长度为 n n,则 1 ≤ k ≤ min ⁡ ( 10 9 , n ) 1≤k≤min(10 9 ,n) 所有输入值均为整数 输入格式 输入通过标准输入给出,格式如下: Q Q query 1 query 1 ​ query 2 query 2 ​ ⋮ ⋮ query Q query Q ​ 其中 query i query i ​ 表示第 i i个查询,其格式为以下两种之一: 1 1 c c x x 2 2 k k 输出格式 设共有 q q个类型 2 2查询。输出 q q行, 第 i i行应包含对第 i i个类型 2 2查询的应答结果。 样例1 Inputcopy Outputcopy 5 1 2 3 1 4 5 2 3 1 6 2 2 5 11 19 第 1 1次查询:将 2 2个 3 3添加到 A A末尾。此时序列变为 A = ( 3 , 3 ) A=(3,3) 第 2 2次查询:将 4 4个 5 5添加到 A A末尾。此时序列变为 A = ( 3 , 3 , 5 , 5 , 5 , 5 ) A=(3,3,5,5,5,5) 第 3 3次查询:移除 A A中前 3 3个元素。被移除的 3 3个整数之和为 3 + 3 + 5 = 11 3+3+5=11,故输出 11 11。移除后序列为 A = ( 5 , 5 , 5 ) A=(5,5,5) 第 4 4次查询:将 6 6个 2 2添加到 A A末尾。此时序列变为 A = ( 5 , 5 , 5 , 2 , 2 , 2 , 2 , 2 , 2 ) A=(5,5,5,2,2,2,2,2,2) 第 5 5次查询:移除 A A中前 5 5个元素。被移除的 5 5个整数之和为 5 + 5 + 5 + 2 + 2 = 19 5+5+5+2+2=19,故输出 19 19。移除后序列为 A = ( 2 , 2 , 2 , 2 ) A=(2,2,2,2) 样例2 Inputcopy Outputcopy 10 1 75 22 1 81 72 1 2 97 1 84 82 1 2 32 1 39 57 2 45 1 40 16 2 32 2 42 990 804 3024 样例3 Inputcopy Outputcopy 10 1 160449218 954291757 2 17217760 1 353195922 501899080 1 350034067 910748511 1 824284691 470338674 2 180999835 1 131381221 677959980 1 346948152 208032501 1 893229302 506147731 2 298309896 16430766442004320 155640513381884866 149721462357295680 cpp: #include <bits/stdc++.h> #define int long long using namespace std; int q; signed main() { cin >> q; queue<int> a; while (q--) { int n; cin >> n; if (n == 1) { int c, x; cin >> c >> x; for (int i = 1; i <= c; i++) a.push(x); } else if (n == 2) { int k, sum = 0; cin >> k; for (int i = 1; i <= k; i++) { sum += a.front(); a.pop(); } cout << sum << endl; } } return 0; } 优化cpp
07-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值