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

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

DDD
DDD원래의
2024-12-03 11:07:09974검색

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

C에서 정수가 아닌 상수에 대한 Switch 문 구현: 템플릿과 매크로를 사용하여 이진 검색 풀기

C의 고전적인 스위치 문은 다음과 같습니다. 정수 값을 기반으로 작업을 선택할 때 효율성이 뛰어난 것으로 알려져 있습니다. 그러나 정수만 사용한다는 제한으로 인해 정수가 아닌 상수를 처리할 때 문제가 발생할 수 있습니다.

문제: 느리고 복잡한 대안

한 가지 접근 방식은 일련의 if 문으로 구성되지만 이는 비효율적이고 유지 관리가 어려울 수 있습니다. 문자열을 정수에 매핑하기 위해 맵과 같은 데이터 구조를 사용하면 추가적인 복잡성과 코딩 오버헤드가 발생할 수 있습니다.

매크로와 템플릿을 사용한 빠르고 정렬된 이진 검색

빠른 결과를 얻으려면, 깔끔하고 간단한 구현으로 매크로와 템플릿 매직을 활용할 수 있습니다. fastmatch.h 라이브러리는 본질적으로 컴파일 타임에 이진 검색을 펼치는 매크로 기반 솔루션을 제공합니다. 구문은 다음과 같은 switch 문과 유사합니다.

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 함수를 생성합니다. 구분은 암시적이며 구문은 정렬됩니다.

업데이트: 향상된 우아함을 위한 C 11 람다 및 초기화 목록

C 11을 사용하면 람다 및 초기화 목록이 다음을 제공합니다. 더욱 우아한 솔루션:

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

template <typename KeyType, typename FunPtrType, typename Comp>
void Switch(const KeyType &value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws, Comp comp) {
  // ... implementation omitted for brevity
}

이 접근 방식은 람다 함수를 사용하여 값과 올바른 사례를 검색하기 위한 lower_bound 알고리즘.

업데이트 2016: 정렬되지 않은 사례에 대한 컴파일 타임 트라이

정렬되지 않은 사례 분기의 경우 고급 솔루션은 compile-Time Trie를 활용합니다. C 11 메타프로그래밍의 타임 트라이 생성. 구현은 GitHub의 cttrie 라이브러리에서 사용할 수 있습니다.

이 접근 방식은 컴파일러의 고급 코드 생성기를 활용하여 검색 프로세스를 크게 최적화하여 정수를 입력으로 요구하는 스위치 문에 필적하는 성능을 제공합니다.

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

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