2013-07-25 78 views
0

爲我的遊戲im試圖完成由C++以下數組結構,因爲數據來自外部來源,應該在lua_script中可用。我可以把lua_table放在另一個表中來通過C++來構建一個多維數組嗎?

數組結構應該看起來像這樣:(數據在映射中,映射包含變量的名稱和對的列表(每對是被認爲是一個子數組中的一個元素的關鍵值對) ...

在地圖製作的數據是完整的,結構definetly沒關係。 所以基本上我有

typedef std::map<std::string, std::list<std::pair> >; 
        /\index(e.g: sword) /\  /\ 
             ||  || 
             || Pair: Contains two strings (key/value pair) 
             || 
             List of Pairs for each array 

items = { 
    ["sword"] = {item_id = 1294, price = 500}, 
    ["axe"] = {item_id = 1678, price = 200}, 
    ["red gem"] = {item_id = 1679, price = 2000}, 
} 

我得到了,使f AR現在是:

for(ArrayMap::iterator it = this->npc->arrayMap.begin(); it != this->npc->arrayMap.end(); it++) { 
    std::string arrayName = (*it).first; 
    if((*it).second.size() > 0) { 
     lua_newtable(luaState); 
     for(ArrayEntryList::iterator itt = (*it).second.begin(); itt != (*it).second.end(); itt++) { 
      LuaScript::setField(luaState, (*itt).first.c_str(), (*itt).second.c_str()); 
     } 
     lua_setglobal(luaState, arrayName.c_str()); 
    } 
} 

但是,這隻會產生以下結構:

(table) 
[item_id] = (string) 2000 
[name] = (string) sword 
[price] = (string) 500 

的問題是,該表可以ofcourse只包含每個索引一次。 這就是爲什麼我需要像「表中的一張桌子」這樣的事情嗎?

有沒有辦法做到這一點?我很高興任何提示。

回答

0

所以從我的理解,如果你有兩個「劍」,那麼你不能存儲第二個?如果是這樣的話,你做錯了。地圖的關鍵點應該是唯一的,如果您決定要使用std::map來存儲您的項目,那麼您的外部來源應該提供唯一的關鍵。在我以前的遊戲中,我使用std::string作爲關鍵。例如:

"WeakSword" -> { some more data } 
"VeryWeakSword" -> { some more data } 

,或者與您的數據(假設ITEM_IDS是唯一的),你可以得到的東西就像從外部來源如下:

1294 -> { some more data } 
1678 -> { some more data } 

我不知道這是怎麼有效的,但我沒」無需編程一個需要硬件的3D 3D遊戲,所以它只是做了一件好事。

您正在使用的數據結構也取決於您將如何使用它。例如,如果你總是通過這種結構迭代你爲什麼不存放如下:

class Item {public: ... private: std::string name; int id; int value;} 
std::vector<Item> items // be careful tho, std::vector copies item before it pushes 

提取(或分析?)從外部源每個實體所需的實際值並將其存儲在std::vector。到達std::vector的中間位置非常昂貴,但是,如果您的意圖不是即時訪問,而是迭代數據,爲什麼要使用映射?但是,如果您的意圖實際上達到了特定的鍵/值對,則應該更改外部數據並使用唯一鍵。

最後,還有另一個存儲非唯一鍵/值對的關聯容器,稱爲std::multimap,但我真的懷疑你真的需要這裏。

+0

嗯,我想你讓我錯了,或者我解釋錯了。項目名稱和ID是唯一的,但我需要爲每個表格字段分配一個數組而不是一個值,因爲每個項目都可以有可選數量的數據。 – Steini

+0

std :: map >其中Properties是爲了存儲某些數據而創建的結構,而key是名稱(或者可以使其成爲id,在這種情況下,key將會是int)。根據你的例子,你可以創建一個Property結構/類,它攜帶可變數量的字段,如int id,std :: vector 價格/成本等。 –

相關問題