2012-03-12 51 views
2

一個簡單的查找功能爲什麼沒有在關聯STD容器一個「查找」功能(圖,設置等)返回一個布爾值?爲什麼沒有爲關聯性病容器

說:

std::map <int,int> mMap; 
... 
if (mMap.contains(75)) ... 

我知道查找(),我也可以這樣來做

if (mMap.find(75) != mMap.end()) ... 

但我覺得它雜波的代碼比什麼都重要。

爲什麼沒有一個更簡單的功能呢,我的意思是容器有很多關於在它們中找到的東西?

+1

像往常一樣,沒有什麼問題downvotes但請不要告訴原因。要知道,沒有教育價值沒有處罰;-) – Valmond 2012-03-12 13:02:17

+4

['性病::地圖:: count'(http://en.cppreference.com/w/cpp/container/map/count)會做你想要什麼。 – KillianDS 2012-03-12 13:07:14

+0

足夠接近作出回答(如果你發佈它,我會接受它)! – Valmond 2012-03-12 13:29:40

回答

1

你可以讓你自己的(注意,這是「HasKey」,因爲「包含」將處理值)

template <class AssocContainer> 
bool HasKey(const AssocContainer& haystack, 
    const typename AssocContainer::key_type& needle) 
{ 
    return haystack.find(needle) != haystack.end(); 
} 

map<int, int> m; 
m[0] = 1; 
bool b = HasKey(m, 0); 
+0

是的,這將工作+1,但也會混亂一點。 – Valmond 2012-03-12 13:27:57

3

一個簡單的原因是它沒用(並且使你更無效)。

想想看這樣,當你說:

mMap.find(75) 

您正在搜索75,但爲了什麼呢?你想稍後使用它!

那麼爲什麼要寫if (mMap.find(75) != mMap.end())然後再找到75來使用它呢?

你可以寫:

std::map<int, int> mMap; 
std::map<int, int>::iterator whatIWant = mMap.find(75); 
if (whatIWant != mMap.end()) 
{ 
    int mapsTo = whatIWant->second; 
    ... 
} 

這意味着你發出find一次,你會得到兩個contains的結果,並在地圖上的實際節點。

+0

是的,我想過但它並非總是如此,有時我需要檢查該值是否有使用前MMAP [57]包含.foo = 1;所以我不會無意中創建一個新條目。順便說一下,你確定這樣的東西現在不會被編譯器優化嗎? – Valmond 2012-03-12 13:26:32

+1

@Valmond - 你列舉的情況正是Shahbaz所描述的情況。用'whatIWant.second.foo = 1'替換你的表達式。這將避免冗餘查找。 – 2012-03-12 13:34:07

+1

有很多用例,你只是想知道它是否存在,而沒有做任何其他的事情。 – visitor 2012-03-12 13:42:27

1

我相信答案是查找功能在這種情況下,2和職責,你可以使用相同的代碼,以便做兩個不同的東西找到,如果它存在,因此較少的代碼錯誤少像往常一樣檢查。

相關問題