2017-12-15 6 views
1

구조 배열을 그런 식으로 정의하여 검색 작업을 쉽게 수행 할 수 있고 열거 형 값을 사용하여 문자열을 검색 할 수 있습니다. 예를 들어C에서 구조체 배열 인덱싱

이 같은 배열을 정의

enum MY_ENUM { 
    MY_ENUM_VAL = 0, 
    MY_ENUM_VAL_8 = 8, 
    MY_ENUM_VAL_50 = 50, 
    MY_ENUM_VAL_200 = 200, 
    MY_ENUM_VAL_565 = 565, 
}; 

struct my_struct { 
    int val; 
    char *str; 
}; 


/* Struct array */ 
struct my_struct my_struct_array[] = { 
    { MY_ENUM_VAL, "str0" }, 
    { MY_ENUM_VAL_8, "str8" }, 
    { MY_ENUM_VAL_50, "str50" }, 
    { MY_ENUM_VAL200, "str200" }, 
    { MY_ENUM_VAL_565, "str565" }, 
}; 

장점은 내가 검색 작업을 수행 할 수 있습니다 내가 배열의 모든 값을 찾을 수없는 경우도 나는 몇 가지 기본 값을 할당 할 수 있다는 것입니다. 그러나 내가 지수는 아래 그럼 내가 검색 작업을 수행 할 수 없습니다와 같은 열거 값을 기준으로하면

char *str50 = my_struct_array[MY_ENUM_VAL50].str; // this won't work. 

같은 열거 값을 사용하여 일부 문자열을 찾으려면 무엇을. 또한 300과 같은 임의의 값이 있으면 쓰레기 값을 얻을 수 있습니다.

/* String array */ 
const char *my_string_array[] = { 
    [MY_ENUM_VAL] = "str0", 
    [MY_ENUM_VAL_8] = "str8", 
    [MY_ENUM_VAL_50] = "str50", 
    [MY_ENUM_VAL200] = "str200", 
    [MY_ENUM_VAL_565] = "str565", 
}; 

위의 두 가지 작업을 모두 수행 할 수 있도록 배열을 정의하는 가장 좋은 방법은 무엇입니까?

+3

* "하지만 열거 형 값을 사용하여 문자열을 찾고 싶다면 ..."* - 간단하고 단순 할 수는 없습니다. 그건 기본 배열이 정의 된 방법이 아니야. 물론 566 개의 포인터 배열을 세울 수 있지만 "기본 값"으로 초기화되고 나머지는 특정 문자열로 설정됩니다. 정교하고 (명백한) 저장 장치 및 초기화 설정 비용으로 직접 검색보다 더 나은 성능을 얻지 못할 것입니다. 즉, 이것이 어떻게 든 코드의 중요한 성능 경로라면, 와우. – WhozCraig

답변

0

빠른 검색은 간단한 작업이 아닙니다. C 언어는 std::map 또는 std::unordered_map (C++) 또는 dict (Python)과 같은 (키, 값) 매핑을 처리하는 간단한 방법을 제공하지 않습니다. 표준 라이브러리의 함수 만 사용할 수 있습니다. C99는 정렬 된 배열에서 이분법 검색을 허용하는 bsearch을 정의하고 Posix는 lsearch (선형 검색) 및 hsearch (키 해시로 직접 액세스)를 정의합니다. 또는 평범하고 단일 C에서 키 배열을 스캔하십시오.

+0

"C 언어는 표준 라이브러리가 아닌 .. map"을 처리하는 간단한 방법을 제공하지 않습니다.하지만, 항상 함수를 작성할 수 있습니다. 어떤 배열 크기에서 이것이 단순한 루프를 능가합니까? (* 거대한 목록에 대해 작업 할 때까지는 초기 해결책이 될 것입니다.) – usr2564301