(一)      实现用字符串作为switch的case子句

1.       问题:

实现用字符串作为switch语句的case子句。形如:


int  main(int argc, const char** argv){

const char* strInput =  argv[1];

switch(strInput){

case  "first":

cout <<  "first... " << endl;

break;

case  "second":

cout <<  "second... " << endl;;

break;

case  "third":

ccout  << "third...  " << endl;

break;

default:

cout <<  "Default..." << endl;

}

}

2.       基本思路

1、用hash函数,设置字符串的hash值,将字符串转换为1个整数;

2、利用c++11自定义文字常量的语法,定义一个constexpr函数,switch的case标签处调用这个constexpr函数。

3.       实现

1、定义一个hash函数,计算出字符串的hash值,将字符串转换为1个整数;

定义: hash_map<const char*, int> CharHash;


struct  CharLess : public binary_function<const char*, const char*, bool>

{

public:

result_type operator()(const  first_argument_type& _Left, const second_argument_type& _Right)  const

{

return(stricmp(_Left, _Right) < 0  ? true : false);

}

};

然而,无论输入任何字符串,都无法找到对应的整数值。因为输入的字符串是指针,和"a"或"b"字符串常量指针的大小是绝对不会相同。解决方法如下:

写一个仿函数CharLess,继承自仿函数基类binary_function。


int  main(int argc, const char** argv){

if (argc <= 1)    cout << "input error ... "  << endl;

const char* strInput =  argv[1];

hash_map<const char*, int,  hash_compare<const char*, CharLess> > CharHash;

CharHash["first"]  = 0;

CharHash["second"] =  1;

CharHash["third"]  = 2;

if(CharHash.find(strInput) ==  CharHash.end()){

cout << "input  error ... " << endl;

return 0;

}

int nVal = CharHash[strInput];

switch(nVal){

case 0:

cout <<  "first... " << endl;

break;

case 1:

cout <<  "second..." << endl;

break;

case 2:

cout <<  "third..." << endl;

break;

default:

cout <<  "Default..." << endl;

}

}

 

2、利用c++11自定义文字常量的语法,定义一个constexpr函数,switch的case标签处调用这个constexpr函数。


constexpr  hash_t hash_compile_time(char const* str, hash_t last_value = basis)

{

return *str ? hash_compile_time(str+1,  (*str ^ last_value) * prime) : last_value;

}

可以写出这样的swich语句:


int main(int  argc, const char** argv)

{

if  (argc <= 1)

cout << "input  error ... " << endl;

const char* str =  argv[1];

switch(hash_(str)){

case  hash_compile_time("first"):

cout << " first "  << endl;

break;

case hash_compile_time("second"):

cout << " second "  << endl;

break;

case  hash_compile_time("third"):

cout << " third "  << endl;

break;

default:

cout << "Default..."  << endl;

}

}

上面的语法还不够漂亮,利用自定义文字常量,重载一个operator如下:


constexpr  unsigned long long operator "" _hash(char const* p, size_t)

{

return hash_compile_time(p);

}

 


int main(int  argc, const char** argv)

{

if  (argc <= 1)

cout << "input  error ... " << endl;

const char* str =  argv[1];

switch(hash_(str)){

case "first"_hash:

cout << " first "  << endl;

break;

case " second"_hash:

cout << " second "  << endl;

break;

case " third"_hash:

cout << " third "  << endl;

break;

default:

cout << "Default..."  << endl;

}

}

 

  1. 4.       参考资料

http://blog.csdn.net/yozidream/article/details/22789147

http://blog.csdn.net/sdhongjun/article/details/4517325

时间: 2024-10-13 09:54:31

(一)      实现用字符串作为switch的case子句的相关文章

详解JAVA字符串类型switch的底层原理

基础 我们现在使用的Java的版本,基本上是都支持String类型的.当然除了String类型,还有int.char.byte.short.enum等等也都是支持的.然而在其底部实现中,还是基于 整型的,也就是int.byte.short这些类型. 我们先来看一下int的一个简单例子,主要部分源代码 public static void main(String [] args){ int n = 2; switch (n){ case 1: break; case 2: break; case

switch中case...用法-c语言

... 表示范围 case 0...4;   // error case 5 ... 9; // ok eg 1: char ch = 4; switch(ch) { case 1: printf(" into 1\n");break; case 3 ... 8: printf( " into 2 to 8\n");break; } out: into 2 to 8 eg 2: switch(c) { case 'a' ... 'z': 操作 break; case

求 1+2+...+n, 要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句 (A?B:C)。

求 1+2+...+n,要求不能使用乘除法.for.while.if.else.switch.case 等关键字以及条件判断语句 (A?B:C). #include <bits/stdc++.h> using namespace std; int Sum(int n) { int Ret = 0; n == 0 || (Ret = Sum(n-1)); return n + Ret; } class A{ public: A() { sum += ++n; } static int sum;

题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)

题目:求1+2+…+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A?B:C). 分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制.但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度. 通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路.由于已经明确限制for和while的使用,循环已经不能再用了.同样,递归函数也需要用if语句或者条件判断语句来判断是继续

swift官方文档中的switch中case let x where x.hasSuffix(&quot;pepper&quot;)是什么意思?

在官方文档中,看到这句.但不明白什么意思. let vegetable = "red pepper" switch vegetable { case "celery": let vegetableComment = "Add some raisins and make ants on a log" case "cocumber", "watercress": let vegetableComment = &

求1+2+3+...+n的值,要求不能使用乘除法,for、while、if、else、switch、case、等关键字及条件判断语句(JAVA)

采用递归和三目表达式注意红色字体一定不能写成n-- 1 package com.hunag; 2 3 public class Sum { 4 5 static int sum; 6 public static int isum(int n) 7 { 8 sum+=n; 9 sum=n==0?sum:isum(--n); 10 System.out.println(n); 11 return sum; 12 } 13 public static void main(String[] args)

【编程题目】求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case和条件语句

看到这个问题,第一个反应是真变态啊. 然后,直觉是不能用循环就只能用递归了.可递归怎么跳出来却遇到了麻烦, 我连goto语句都考虑了也没弄好. 后来想到一个非常NC的方法:查找表. 如果n限定一个比较小的范围直接用查找表好了. 但题目的目的肯定不是这样的..... 后来,我转换了一下思路 1+2...+n = (n*n + n)>>1  只要求出n*n来就好了, 但问题是不能用乘法,于是硬件出身的我想到了二进制&,|,>>,<<都是可以用的. 思路:设n = 5

选择结构的三角关系Switch、Case、Default!!!

选择结构的三角关系Switch.Case.Default!!! 今天我们学习选择结构进化章节--Switch结构,他与if有什么区别呢? 相同点: 都是用来处理多分支条件的结构 不同点: switch选择结构 只能处理等值条件判断的情况 好了,我们开始学习吧 1.switch选择结构:语法:switch (key) {case value: break;case value: break;case value: break;default: break;}根据key去匹配value的值,如果va

c++ switch和case的用法

#include "pch.h" #include<iostream> using namespace std; const float PI = 3.1415926; int main() { int iType; float readius, a, b; while (true){ cout << "图形的类型为?(1-圆形 2-长方形 3-正方形)"; cin >> iType; switch (iType) { case