亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C ++比較變量和多個值的最有效方法?

C ++比較變量和多個值的最有效方法?

C++
慕村225694 2019-11-18 18:35:58
在程序中幾次,我不得不檢查變量是否是許多選項之一。例如if (num = (<1 or 2 or 3>)) { DO STUFF }我已經把“ OR”弄亂了,但是似乎沒有什么是對的。我試過了if (num == (1 || 2 || 3))但它什么也沒做。請幫忙!提前致謝。PS我需要區分幾個組。例如...if (num = (1,2,3))else if (num = (4,5,6))else if (num = (7,8,9))
查看完整描述

3 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

如果要檢查的值足夠小,則可以為要查找的值創建一個位掩碼,然后檢查要設置的位。


假設您關心幾個小組。


static const unsigned values_group_1 = (1 << 1) | (1 << 2) | (1 << 3);

static const unsigned values_group_2 = (1 << 4) | (1 << 5) | (1 << 6);

static const unsigned values_group_3 = (1 << 7) | (1 << 8) | (1 << 9);    

if ((1 << value_to_check) & values_group_1) {

  // You found a match for group 1

}

if ((1 << value_to_check) & values_group_2) {

  // You found a match for group 2

}

if ((1 << value_to_check) & values_group_3) {

  // You found a match for group 3

}

這種方法最適合于不超過CPU喜歡使用的自然大小的值。在現代通常為64,但是可能會因環境的不同而有所不同。


查看完整回答
反對 回復 2019-11-18
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

這是C ++ 11中的一種使用方法std::initializer_list:


#include <algorithm>

#include <initializer_list>


template <typename T>

bool is_in(const T& v, std::initializer_list<T> lst)

{

    return std::find(std::begin(lst), std::end(lst), v) != std::end(lst);

}

這樣,您可以執行以下操作:


if (is_in(num, {1, 2, 3})) { DO STUFF }

但是,當不與內置類型一起使用時,效率不是很高。int可以正常工作,但是std::string例如,如果您比較變量,則生成的代碼簡直糟透了。


但是,在C ++ 17中,您可以改用效率更高的解決方案,該解決方案適用于任何類型:


template<typename First, typename ... T>

bool is_in(First &&first, T && ... t)

{

    return ((first == t) || ...);

}


// ...


// s1, s2, s3, s4 are strings.

if (is_in(s1, s2, s3, s4)) // ...

在C ++ 11版本將是非常低效的位置,而這個版本應該產生相同的代碼手寫比較。


查看完整回答
反對 回復 2019-11-18
  • 3 回答
  • 0 關注
  • 761 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號