Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2415|回复: 8
打印 上一主题 下一主题

Qt常见容器使用

[复制链接]

257

主题

354

帖子

1677

积分

金牌会员

Rank: 6Rank: 6

积分
1677
跳转到指定楼层
楼主
发表于 2016-12-7 09:44:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jimu 于 2016-12-7 10:35 编辑

1.QVector
QVector<QReadMailWindow *> m_pVecReadMailWindows;
//循环删除
  1. for (int i = 0; i < m_pVecReadMailWindows.size(); i++)
  2. {
  3.         if (m_pVecReadMailWindows.at(i) != NULL)
  4.         {
  5.                 delete m_pVecReadMailWindows.at(i);
  6.                 m_pVecReadMailWindows.erase(m_pVecReadMailWindows.begin() + i);
  7.         }
  8. }
复制代码
//添加
  1. QReadMailWindow *rWin = new QReadMailWindow(mailId);
  2.     m_pVecReadMailWindows.push_back(rWin);
复制代码
//查询
  1. foreach(QReadMailWindow * rWin, m_pVecReadMailWindows)
  2.     {
  3.         if (rWin->getCloseStatus())
  4.         {
  5.             return rWin;
  6.         }
  7.     }
复制代码
qFind 查询 to implement operator==().

struct UserOperateAction
{
    UserOperateAction()
    : serverId(DEFAULT_VALUE_ZERO)
    , operType(UOAT_UNKNOWE)
    {
    }
    uint32_t serverId;
    QString listPath;
    QString uid;
    int operType;
    bool operator == (const UserOperateAction& rhs) const
    {
        return (serverId == rhs.serverId &&
            listPath == rhs.listPath &&
            uid == rhs.uid &&
            operType == rhs.operType);
    }
};


bool queryUserOperAct(const UserOperateAction & stUserOperateAction)
{
    QVector<UserOperateAction>::const_iterator itFind = qFind(m_vecUserOperActs.begin(), m_vecUserOperActs.end(), stUserOperateAction);
    if (itFind != m_vecUserOperActs.end())
    {
        return true;
    }
    return false;
}


bool clearUserOperAct()
{
    for (int i = 0; i < m_vecUserOperActs.size(); i++)
    {
        m_vecUserOperActs.erase(m_vecUserOperActs.begin() + i);
    }
}

bool removeUserOperAct(const UserOperateAction & stUserOperateAction)
{
    QMutexLocker locker(&m_userOperActMutex);
    QVector<UserOperateAction>::iterator itFind = qFind(m_vecUserOperActs.begin(), m_vecUserOperActs.end(), stUserOperateAction);
    if (itFind != m_vecUserOperActs.end())
    {
        m_vecUserOperActs.erase(itFind);
    }
    return true;
}



2.QList
QMutex  m_folderMutex;
QMutexLocker locker(&m_folderMutex);

QList<MailFolderInfo> m_listMailFoldersData;

//查询
for (int i = 0; i < m_listMailFoldersData.size(); ++i)
{
        if (m_listMailFoldersData.at(i).parentId == parentId)
        {
                return m_listMailFoldersData.at(i).rowId;
        }

}

//排序

qSort(m_listMailFoldersData.begin(), m_listMailFoldersData.end(), folderSortAlgorithm);

bool folderSortAlgorithm(const MailFolderInfo &mfi1, const MailFolderInfo &mfi2)
{
    return mfi1.name < mfi2.name
}

//添加
bool addMailFolder(MailFolderInfo&  stMailFolderInfo)
{
    QMutexLocker locker(&m_folderMutex);
    m_listMailFoldersData.push_back(stMailFolderInfo);
}

//删除

bool CMemoryDBManager::deleteMailFolder(uint32_t folderId)
{
    QMutexLocker locker(&m_folderMutex);
    for (int i = 0; i < m_listMailFoldersData.size(); ++i) {
        if (m_listMailFoldersData.at(i).rowId == folderId){
            m_listMailFoldersData.removeAt(i);
            break;
        }
    }
}

//修改
bool updateMailFolderLegalMailCount(uint32_t folderId, uint32_t count)
{
    QMutexLocker locker(&m_folderMutex);
    for (int i = 0; i < m_listMailFoldersData.size(); ++i) {
        if (m_listMailFoldersData.at(i).rowId == folderId){
            m_listMailFoldersData.legalMailCountOnServer = count;
            break;
        }
    }
    return true;
}


3.QMap

//查询 不能用 [] 防止引入 新元素
MailHeaderInfo getMailHeader(uint64_t mailId)
{
    QMapIterator<uint32_t, MemoryMailData> iter(m_mapMailMemoryData);
    while (iter.hasNext()) {
        iter.next();
        for (int i = 0; i < iter.value().vecMailIndexDatas.size(); ++i) {
            if (iter.value().vecMailIndexDatas.at(i).mailId == mailId){
                return iter.value().vecMailIndexDatas.at(i);
            }
        }
    }
}




回复

使用道具 举报

165

主题

269

帖子

957

积分

认证用户组

Rank: 5Rank: 5

积分
957
沙发
发表于 2016-12-30 18:20:55 | 只看该作者
QMap 删除元素
  1. for (auto it = map.begin(); it != map.end(); /* don't increment here */) {
  2.     if (it.value() % 2 == 1) {
  3.         it = map.erase(it);
  4.     } else {
  5.         ++it;
  6.     }
  7. }
复制代码
回复 支持 反对

使用道具 举报

165

主题

269

帖子

957

积分

认证用户组

Rank: 5Rank: 5

积分
957
板凳
发表于 2017-1-3 11:14:47 | 只看该作者
QMap添加
  1. bool CMemoryDBManager::addMailRecord(MailHeaderInfo&  stMailInfo)
  2. {
  3.     QMutexLocker locker(&m_mailMutex);
  4.     m_mapMailMemoryData[stMailInfo.folderId].vecMailIndexDatas.push_back(stMailInfo);
  5.     regenerateMailListModelData();
  6.     return true;
  7. }
复制代码
回复 支持 反对

使用道具 举报

165

主题

269

帖子

957

积分

认证用户组

Rank: 5Rank: 5

积分
957
地板
发表于 2017-1-5 17:13:27 | 只看该作者
  1. bool  CMemoryDBManager::delMailIndex(uint32_t folderId, const QString & uid)
  2. {
  3.     QMutexLocker locker(&m_mailIndexMutex);
  4.     for (int i = 0; i < m_mapMailIndexData[folderId].vecSyncMailIndexs.size(); ++i) {
  5.         if (m_mapMailIndexData[folderId].vecSyncMailIndexs.at(i).uid == uid)
  6.         {
  7.             m_mapMailIndexData[folderId].vecSyncMailIndexs.removeAt(i);
  8.             return true;
  9.         }
  10.     }
  11.     return false;
  12. }
复制代码
回复 支持 反对

使用道具 举报

165

主题

269

帖子

957

积分

认证用户组

Rank: 5Rank: 5

积分
957
5#
发表于 2017-1-10 17:11:04 | 只看该作者
QList查询 find
  1. QList<SyncMailIndexInfo>::const_iterator itFind = qFind(m_mapMailIndexData[folderId].vecSyncMailIndexs.begin(), m_mapMailIndexData[folderId].vecSyncMailIndexs.end(), stSyncMailIndexInfo);
  2.     if (itFind == m_mapMailIndexData[folderId].vecSyncMailIndexs.end())
  3.     {
  4.         return false;
  5.     }
  6.     return true;


  7. struct SyncMailIndexInfo
  8. {
  9.     SyncMailIndexInfo()
  10.     : indexPop(DEFAULT_VALUE_ZERO)
  11.     , flags(DEFAULT_VALUE_ZERO)
  12.     , date(NOT_SET_VALUE)
  13.     , operType(IOT_ADD)
  14.     {
  15.     }

  16.     QString uid; //exchange id
  17.     uint32_t indexPop; //兼容 pop
  18.     uint32_t flags;
  19.     uint64_t date;
  20.     IndexOperType operType;
  21.     bool operator == (const SyncMailIndexInfo& rhs) const {
  22.         return (uid == rhs.uid && operType == rhs.operType);
  23.     }
  24. };
复制代码
回复 支持 反对

使用道具 举报

1228

主题

1996

帖子

7570

积分

认证用户组

Rank: 5Rank: 5

积分
7570
6#
发表于 2017-1-22 10:55:14 | 只看该作者
循环排序时注意:如果vec中不含有一条记录,要防止i=0时这种情况还进行排序,就会出异常
  1. //对分组内邮件默认按时间排序
  2.     if (m_vecMailGroupModelData.size() > 0)  //去掉对i=0时还进行排序
  3.     {
  4.         for (int i = 0; i < m_vecMailGroupModelData.size(); i++)
  5.         {
  6.             qSort(m_vecMailGroupModelData[i].vec_mailIds.begin(), m_vecMailGroupModelData[i].vec_mailIds.end(), CMemoryDBManager::compMailTimeDescEx);
  7.         }
  8.     }
复制代码
回复 支持 反对

使用道具 举报

1228

主题

1996

帖子

7570

积分

认证用户组

Rank: 5Rank: 5

积分
7570
7#
发表于 2017-1-23 11:53:58 | 只看该作者
QSet
  1. QSet<QuerySummaryInfo>::const_iterator iter = setQuerySummarys.constBegin();
  2.     while (iter != setQuerySummarys.constEnd()) {
  3.         qDebug() << (*iter).mailId << " " << (*iter).data;
  4.         ++iter;
  5.     }
复制代码
回复 支持 反对

使用道具 举报

1228

主题

1996

帖子

7570

积分

认证用户组

Rank: 5Rank: 5

积分
7570
8#
发表于 2017-1-24 12:23:22 | 只看该作者
QMap引入 新元素的问题  由于外部还有一个for循环造成 且索引在一直增大,这样会造成内部数据一直增大,如果没有外部循环 即j是定死的,则不会出现内存暴涨
  1. 暴涨版:

  2.     for (int j = 0; j < m_mapMailMemoryData.size(); ++j) {
  3.         for (int i = 0; i < m_mapMailMemoryData[j].vecMailIndexDatas.size(); ++i) {
  4.             if (m_mapMailMemoryData[j].vecMailIndexDatas.at(i).mailId == mailId){
  5.                 return m_mapMailMemoryData[j].vecMailIndexDatas.at(i);
  6.             }
  7.         }
  8.     }

  9. 修改版:
  10. QMapIterator<uint32_t, MemoryMailData> iter(m_mapMailMemoryData);
  11.     while (iter.hasNext()) {
  12.         iter.next();
  13.         for (int i = 0; i < iter.value().vecMailIndexDatas.size(); ++i) {
  14.             if (iter.value().vecMailIndexDatas.at(i).mailId == mailId){
  15.                 return iter.value().vecMailIndexDatas.at(i);
  16.             }
  17.         }
  18.     }
复制代码
回复 支持 反对

使用道具 举报

1228

主题

1996

帖子

7570

积分

认证用户组

Rank: 5Rank: 5

积分
7570
9#
发表于 2017-2-15 11:53:12 | 只看该作者
QList删除
  1.    for (auto it = childItems.begin(); it != childItems.end(); /* don't increment here */) {
  2.         if ((*it)->stItemData.id == itemData.id)
  3.         {
  4.             delete (*it);
  5.             it = childItems.erase(it);
  6.             break;
  7.         }
  8.         else
  9.         {
  10.             ++it;
  11.         }
  12.     }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-4-20 09:09 , Processed in 0.076984 second(s), 18 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表