1

好的,这很难解释。我试图在这里写一个 100 行的解释,在我看到我失败后,我试图创建一个图像来更好地解释它,这也失败了http://img208.imageshack.us/img208/7383/48821020.png

这似乎是不可能的,因为它的复杂性极高。最原始的是,我需要为字符串的每个部分分配 ID。目前我可以为字符串示例分配 ID:

He: hey
She: Hi
He: What's up
She: Not much, you?
He: I'm fine, i'm selling a <Scale Armor> wanna buy it?
She: Next time maybe.

我可以What's up使用该函数返回,CString szText = GetTextAtLine(3);因为What's up它位于聊天的第三行。每行都有一个Id,Id就是行号。每行还有一个指向名为 的类的指针CItemElem。CItemElem 包含有关项目的所有信息。

我使用以下函数定位指针CItemElem *pItem = GetItemAtLineId(5),它将返回存储在行标识符map<unsigned int,CItemElem*>mItemChat所在位置unsigned int的指针。每次有人在聊天中交谈时,如果在聊天中输入了一个项目,则一个新元素会插入到 STL 映射中,并带有它的 line id。

CItemElem* CEditString::GetItemAtLineId( unsigned long uLine )
{

    for( map<unsigned int,CItemElem*>::iterator it = m_mItemChat.begin(); it != m_mItemChat.end(); ++it )
    {
        if( uLine == it->first )
            return( it->second );
    }

    return NULL;
}

如您所见,我可以CItemElem通过行 ID 定位一个指针,但现在我的问题是我需要在字符串中定位多个项目,因为一次最多可以在一个句子中输入 3 个项目:

He: Hey guys i'm selling <Scale Boots> <Wooden Sword> <Water Helmet> cool items!

目前,我一次只能在一个聊天语句中返回 1 个项目,因为我可以通过行 ID 找到该项目。过去几个小时我一直在敬酒,请启发我如何能够在同一个句子 ID 中返回多个项目。

非常感谢!

4

1 回答 1

1

正如评论所建议的那样,使用向量CItemElem*作为映射中的值,或者编写另一个包装它的类以提高可读性,同时考虑到未来需要添加除CItemElem. 此外,如果字符串位置是查找项目所需的键,则map可以使用 a 代替 a vector。将跨越项目的每个字符串位置设置为指向该特定项目的指针,以便当您拥有鼠标悬停的字符串位置时可以轻松检索它。

class CLineElem
{

public:
void AddItemElem( CItemElem* pElem_i, int nStrPos_i );
CItemElem* GetItemElemAt( int nStrPos_i );
void RemoveAllItemElems();

private:
    map<unsigned int, CItemElem*> m_Elems;
};

然后CLineElem*在地图中使用m_mItemChat而不是CItemElem*

于 2012-07-10T04:13:08.027 回答