>백엔드 개발 >C++ >C/C에서 정수가 아닌 인수를 사용하여 Switch 문을 효율적으로 구현할 수 있습니까?

C/C에서 정수가 아닌 인수를 사용하여 Switch 문을 효율적으로 구현할 수 있습니까?

DDD
DDD원래의
2024-11-28 07:25:14925검색

How Can I Efficiently Implement a Switch Statement with Non-Integer Arguments in C/C  ?

C/C Switch 문의 정수가 아닌 인수

C/C의 switch 문은 정수 값을 기반으로 효율적인 분기를 허용하는 강력한 제어 흐름 메커니즘입니다. . 그러나 문자열이나 열거형과 같은 정수가 아닌 값을 켜는 것이 바람직한 경우가 많습니다. switch 문은 정수 인수만 허용하므로 이는 문제가 됩니다.

기존 접근 방식

정수가 아닌 스위치 인수를 처리하는 전통적인 접근 방식 중 하나는 일련의 if 문을 사용하는 것입니다.

if( str == "foo" )      ...
else if( str == "bar" ) ...
else                    ...

그러나 이 접근 방식은 n개의 경우에 대해 선형 시간 복잡도(O(n))가 필요하므로 비효율적입니다. 보다 효율적인 해결책은 맵이나 중첩된 if를 사용하여 정수가 아닌 값을 정수로 표현하는 것입니다. 그러나 이러한 접근 방식은 복잡하고 오류가 발생하기 쉽습니다.

매크로를 사용한 이진 검색

매크로를 사용하면 컴파일 타임에 언롤링된 이진 검색을 구현할 수 있어 빠르고 구문이 가능합니다. -친숙한 접근 방식:

#define NEWMATCH
#define MATCH("asd")
  some c++ code
#define MATCH("bqr")
  ... the buffer for the match is in _buf
#define MATCH("zzz")
  ...  user.YOURSTUFF 
#define ENDMATCH(xy_match)

이 매크로는 문자열을 입력으로 사용하고 부울을 반환하는 함수를 생성하여 이진 검색을 구현합니다.

C 11 람다 및 이니셜라이저 목록

C 11에서 람다 및 이니셜라이저 목록은 더욱 우아하고 간결한 접근 방식을 제공합니다.

template<typename KeyType, typename FunPtrType>
void switchStatement(const KeyType& value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws) {
    std::lower_bound(sws.begin(), sws.end(), value, [&](const auto& a, const auto& b) { return a.first < b.first; });
    if (r != sws.end() && !cmp(val, *r)) { r->second(); } // else: not found
}
int main() {
    switchStatement<const char*, void(*())>("ger", {
        { "asdf", []{ printf("0\n"); } },
        { "bde", []{ printf("1\n"); } },
        { "ger", []{ printf("2\n"); } },
    });
    return 0;
}

컴파일 타임 트리

현대 C에서 C 11 메타프로그래밍 기술은 다음과 같습니다. 정렬되지 않은 사례 분기를 효율적으로 처리할 수 있는 고급 데이터 구조인 컴파일 타임 트리를 생성하는 데 활용됩니다.

#include <smile/cttrie/cttrie.h>

using namespace smile::cttrie;

// Define cases as string literals
trie<true, void()> s = {"foo", "bar"};

int main() {
  // Switch on a string
  s.switch_on("foo", []() { std::cout << "foo" << std::endl; });
  return 0;
}

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

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