2014-09-09 2 views
0

'x'와 'y'의 두 키를 사용하여 값을 저장하는 구조체를 만들고 싶습니다. 나는 std :: map>을 사용할 것이라고 생각했다. 그러나 나는 하나의 std :: map을 사용하고 두 키를 하나의 키로 결합하는 것이 더 좋을 것이라고 생각한다 (나는 그것을 'p'라고 부를 것이다).2D 공간을 1D 시퀀스로 덮기

그래서 함수 p -> (x, y)와 함수 (x, y) -> p가 필요합니다. 'x'와 'y'는 모두 음수 값을 허용하는 정수 유형입니다.

나는 그것이 가능해야한다고 생각하지만 나는 인터넷에서 그것에 대해 많은 기사를 찾지 못했음에 놀랐다.

나는 그것을하는 방법에 대한 아이디어가 있지만, 모두 너무 복잡해 보입니다. 이 문제에 관해 읽을 주제 나 주제를 알려주시겠습니까? 난 그냥 당신의 tuple이 예를위한 std::map<std::tuple<int,int>, int>을 사용

http://i.stack.imgur.com/UbVaM.png

+0

에서

이미지? – Jarod42

+0

X와 Y는 부호가있는 정수 유형입니다. 예를 들어 'int'. – Ivorne

+0

일부 그리드를 사용하지 않는 것이 좋습니다 (모든 값이 올바른 오프셋으로 양수 인 것처럼)? – Jarod42

답변

1

:-) 어떤 조언 주셔서 감사합니다 :

가능한 매핑의 예 (그러나 나는 그런 식의 수학적 형태가 필요합니다) (x,y)이고 값은 z입니다. 그렇지 않으면 p(x,y)z으로 1 : 1 매핑을 유지하는 것이 어려울 것입니다.

+0

내 접근 방식보다보기가 더 쉽습니다. 하지만 이것은 std :: unordered_map에서는 작동하지 않습니다. 모든 아이디어가 unordered_map과 작동하도록 만드는 방법은 무엇입니까? std :: tuple 에 대한 해시 함수를 만들 수는 있지만 성능 문제를 일으키지 않을만큼 충분히 숙련되지는 않을까 걱정됩니다. 물론 std :: map을 사용할 수 있습니다. – Ivorne

0

노조를 사용하는 것은 어떻습니까?

union p_t { 
    p_t(int64_t c) : k(c) {} 
    p_t(int32_t a, int32_t b) : x(a), y(b) {} 
    int64_t k; 
    struct { int32_t x, y; }; 
}; 

std::map<decltype(p_t::k), int> m1; 
std::unordered_map<decltype(p_t::k), int> m2; 
p_t p = p_t(rand(), rand()); 
m1[p.k] = rand(); 
m2[p.k] = rand(); 

라이브 예 : http://ideone.com/jebyG6

0

당신은 시도 할 수와 유사한 사용 기능이 각 부분과 각각의 양에 대해 고유 한 부분에 대해 고유 한 정수를 제공 정수만큼의 분수가있는 표시하는 데 사용 정수. 그것은 x, y 좌표에서도 똑같이 작동합니다. p -> (x, y)와 (x, y) -> p의 두 함수는 다소 복잡하지만 작성할 수 있습니다. 일종의 나선형 모양을 사용하여 아이디어를 적용 할 수 있습니다.

assigning integers to fractions form wikipedia Rational_number. `(X, Y) '의 범위 란 https://commons.wikimedia.org/wiki/File:Diagonal_argument.svg

+0

나는 그것을 시도했다. 이것은 가능하고 어렵지 않습니다. 놀랍게도, 내가 양수 값과 음수 값으로 일반화하려고하면, 꽤 복잡해지고 있습니다. – Ivorne

+0

예 수식을 찾기가 쉽지 않을 수 있습니다. 양수를 정수로 변환하는 몇 가지 쉬운 방법이 있습니다. 홀수는 0 -> 0, 1 -> -1, 2 -> 1, 3 -> -2, 4 -> 2의 네거티브와 짝수에 매핑 할 수 있습니다.위와 결합하면 정수에서 쌍으로 된 정수를 얻을 수 있습니다. –

+0

좋아, 나는 그것을 시도 할 것이다. 고맙습니다 :-) – Ivorne