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.

チャットの3行目にあるのでWhat's up、この機能を使って戻ることができます。各行にはIDがあり、Idは行番号です。各行には、という名前のクラスへのポインタもあります。CItemElemは、アイテムに関するすべての情報を保持します。CString szText = GetTextAtLine(3);What's upCItemElem

次の関数を使用してポインタを見つけます。ここにCItemElem *pItem = GetItemAtLineId(5)格納されているポインタが返されます。map<unsigned int,CItemElem*>mItemChatここunsigned intで、は行のインデックスです。チャットでアイテムが入力されている場合、誰かがチャットで何かを話すたびに、新しい要素がそのラインIDでSTLマップに挿入されます。

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;
}

ご覧のとおり、行Idでポインタを見つけることができますCItemElemが、問題は、一度に最大3つの項目を入力できるため、文字列で複数の項目を見つける必要があることです。

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

現在、行IDでアイテムを見つけることができるため、チャット文で一度に1つのアイテムしか返すことができません。私は過去数時間脳を乾杯してきました。同じ文IDで複数のアイテムを返すことができる方法を教えてください。

どうもありがとう!

4

1 に答える 1

1

コメントが示唆しているようCItemElem*に、マップの値としてのベクトルを使用するか、または以外のタイプを追加する将来の必要性を考慮して、読みやすくするためにそれをラップする別のクラスを記述しますCItemElem。また、文字列の位置がアイテムを見つけるために必要なキーである場合は、のmap代わりに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_mItemChatCItemElem*

于 2012-07-10T04:13:08.027 に答える