POD(Plain Old Data) 상수가 아닌 상수로 작업할 때 서로 다른 코드 경로 중에서 선택해야 합니다. 상수 값을 기준으로 합니다. 그러나 기존의 스위치 문은 정수 값만 허용합니다. 이는 정수가 아닌 상수 중에서 선택하는 문제를 제시합니다.
기존 접근 방식: 중첩 if 문
이를 처리하는 간단한 방법은 일련의 중첩 if를 사용하는 것입니다. 다음과 같은 명령문:
if( str == "foo" ) ... else if( str == "bar" ) ... else ...
간단하지만 번거롭고 비효율적일 수 있습니다. O(n) 복잡도를 갖기 때문에 사례 수가 많습니다. 여기서 "n"은 사례 수입니다.
고급 기술
더 나은 효율성을 달성하려면 더 발전된 기술을 채용할 수 있습니다. 한 가지 접근 방식은 맵과 같은 데이터 구조를 사용하여 문자열을 정수로 표현한 다음 표준 스위치 문을 사용하는 것입니다. 그러나 이로 인해 코딩이 더욱 복잡해집니다.
컴파일 시간의 마법: 매크로 및 템플릿의 마법
독특한 접근 방식은 매크로 및 템플릿 마법을 사용하여 언롤링된 바이너리를 생성하는 것입니다. 컴파일 타임에 검색하세요. fastmatch.h와 같은 라이브러리는 대소문자 일치를 정의하기 위한 깔끔한 구문을 제공할 수 있습니다.
NEWMATCH MATCH("asd") some c++ code MATCH("bqr") ... the buffer for the match is in _buf MATCH("zzz") ... user.YOURSTUFF /*ELSE optional */ ENDMATCH(xy_match)
이것은 쉽게 호출할 수 있는 xy_match(char *&_buf, T &user)와 같은 함수를 생성합니다.
C 11 업데이트: 람다 및 초기화 프로그램 목록
C 11을 사용하면 람다 및 초기화 목록이 더 깔끔한 솔루션을 제공합니다.
Switch("ger", { {"asdf", []{ printf("0\n"); }}, {"bde", []{ printf("1\n"); }}, {"ger", []{ printf("2\n"); }} }, [](const char *a, const char *b) { return strcmp(a, b) < 0; });
이 접근 방식은 정렬된 사례 일치 목록에서 이진 검색을 활용하여 효율적인 O( log n) 복잡성.
컴파일 시간 Trie
더 발전된 방식으로 컴파일 타임 시도를 활용하여 정렬되지 않은 사례 분기를 처리할 수 있습니다. 이 접근 방식은 고급 C 11 메타 프로그래밍을 사용하여 컴파일 타임에 검색 트리를 생성합니다. 각 trie 노드에는 코드 생성을 최적화하기 위한 스위치 문이 포함되어 있습니다.
구현은 GitHub(smileingthax/cttrie)에서 확인할 수 있습니다.
위 내용은 C/C Switch 문에서 정수가 아닌 상수를 효율적으로 처리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!