> 백엔드 개발 > C++ > C/C에서 정수가 아닌 값에 대한 Switch 문을 효율적으로 구현할 수 있습니까?

C/C에서 정수가 아닌 값에 대한 Switch 문을 효율적으로 구현할 수 있습니까?

Linda Hamilton
풀어 주다: 2024-12-04 09:08:15
원래의
195명이 탐색했습니다.

How Can I Efficiently Implement a Switch Statement for Non-Integer Values in C/C  ?

C/C에서 정수가 아닌 값 켜기

문제:

조치 결정 POD가 아닌 상수 요소(예: 문자열)를 기반으로 하는 경우 해결 방법이 필요합니다. 비효율적이고 복잡할 수 있는 중첩된 ifs와 같습니다. 정수 값용으로 설계된 스위치 문은 정수가 아닌 값을 직접 지원하지 않습니다.

해결 방법 1: 매크로 및 템플릿 매직(fastmatch.h)

매크로 및 템플릿 사용 템플릿을 사용하면 컴파일 타임에 펼쳐진 이진 검색을 만들 수 있습니다. 구문은 간결하지만 정렬된 케이스 분기가 필요합니다. 이 접근 방식은 관련 일치 항목을 버퍼에 할당하는 암시적 중단이 있는 함수를 생성합니다.

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("bqr",youruserdata);
로그인 후 복사

해결책 2: C 11 람다 및 초기화 목록

C 11 , 람다 및 초기화 목록은 더 깔끔한 솔루션을 제공합니다. 이 접근 방식은 키-값 쌍 목록에서 이진 검색을 수행합니다. 여기서 키는 정수가 아닌 값에 해당하고 값은 함수 포인터입니다. 그런 다음 발견된 함수가 호출됩니다.

#include <utility>
#include <algorithm>
#include <initializer_list>

template <typename KeyType, typename FunPtrType, typename Comp>
void Switch(const KeyType &amp;value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws, Comp comp) {
  // ... search and invoke code
}

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;});
로그인 후 복사

해결책 3: 컴파일 타임 트라이(cttrie)

C 11에서 컴파일 타임 트라이 접근 방식은 정렬되지 않은 함수를 처리할 수 있습니다. 케이스가 쉽게 분기됩니다. 고급 메타프로그래밍 기술은 실행 흐름을 효율적으로 리디렉션하기 위해 각 트리 노드의 스위치 문을 활용하여 컴파일 타임에 검색 트리를 생성합니다.

전체 구현은 github: smileingthax/cttrie에서 확인할 수 있습니다.

위 내용은 C/C에서 정수가 아닌 값에 대한 Switch 문을 효율적으로 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿