>백엔드 개발 >C++ >C/C Switch 문에서 정수가 아닌 상수를 효율적으로 처리하려면 어떻게 해야 합니까?

C/C Switch 문에서 정수가 아닌 상수를 효율적으로 처리하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-30 14:46:12947검색

How Can I Efficiently Handle Non-Integer Constants in a C/C   Switch Statement?

C/C에서 정수가 아닌 상수로 전환

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.