2013-07-25 1 views
0

내 게임에서 데이터가 외부 소스에서 왔고 lua_script에서 사용할 수 있어야하므로 다음 배열 구조를 C++로 수행하려고합니다.다른 테이블에 lua_table을 넣어서 C++을 통해 다차원 배열을 만들 수 있습니까?

배열 구조는 다음과 같아야합니다. (데이터는 맵에 있고 맵에는 변수 이름과 쌍 목록이 포함됩니다 (각 쌍은 하나의 하위 배열에서 하나의 요소로 간주되는 키 값 쌍입니다) ...지도에서 준비

데이터는 완료되고 구조의 definetly 괜찮습니다. 그러니까 기본적으로 내가

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

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 

내가 너무 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 

문제는 테이블이 당연히 한 번만 각 인덱스를 포함 할 수 있다는 것입니다. "테이블에있는 테이블"과 같은 것이 필요한 이유는 무엇입니까?

이 방법이 있습니까? Im는 어떤 암시라도 기쁘게 생각한다.

답변

0

그래서 내가 이해하는 바에 따르면, 두 개의 "검"이 있다면 두 번째를 저장할 수 없습니까? 그렇다면 잘못하고있는 것입니다. 지도의 키는 고유해야하며 std::map을 사용하여 항목을 저장하려는 경우 외부 소스가 고유 키를 제공해야합니다. 이전 게임에서는 std::string을 키로 사용했습니다. 예 :

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

또는, 당신의 데이터를 외부 소스에서 다음과 같이 뭔가를 얻을 수 있습니다 (가정 item_ids는 고유) :이 얼마나 효율적으로 잘 모르겠어요

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

하지만 난 '년후 하드웨어가 부족한 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는 일부 데이터를 저장하기 위해 만들 수있는 구조이며 이름은 키입니다 (또는 ID로 만들 수 있습니다. int). 귀하의 예제에 따르면 int id, std :: vector 가격/비용 등의 다양한 필드를 전달하는 Property 구조/클래스를 생성 할 수 있습니다. –