9.为包含指针的关联容器指定比较类型
有如下代碼:
std::set<std::string*> datas; datas.insert(new std::string("Anteater")); datas.insert(new std::string("Wombat")); datas.insert(new std::string("Lemur")); datas.insert(new std::string("Penguin"));打印datas中的內(nèi)容:
for (auto* pData : datas) {std::cout << *pData << std::endl; }希望輸出的內(nèi)容是按照字母順序排序,然后卻并非如此。
原因如下:
類型std::set,補(bǔ)全后其實(shí)際的類型為:
std::set, std::allocator>。
這里,排序準(zhǔn)則是std::less而非希望的按照字母順序排序的準(zhǔn)則std::less,它將按照std::string*的指針值進(jìn)行排序,而不是std::string的值進(jìn)行排序。
如果想讓std::string*數(shù)據(jù)在std::set中按照字母順序排序,必須編寫自己的排序準(zhǔn)則。排序準(zhǔn)則用在序列容器的定義中時(shí),語(yǔ)法要求其必須是個(gè)類型,不能是普通函數(shù)需要使用函數(shù)對(duì)象(函數(shù)子)。C++11中引入了Lambda表達(dá)式,它的返回值就是函數(shù)對(duì)象。
最新的類型聲明為:
auto sortFunc = [](const std::string* pLeft, const std::string* pRight) {return *pLeft < *pRight; ?}; std::set<std::string*, sortFunc> datas; ...每當(dāng)你要?jiǎng)?chuàng)建包含指針的關(guān)聯(lián)容器時(shí),一定要記住,容器將會(huì)按照指針的值進(jìn)行排序。絕大多數(shù)情況下,這不會(huì)是你所希望的,所以你幾乎肯定要?jiǎng)?chuàng)建自己的函數(shù)對(duì)象作為該容器的比較函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的9.为包含指针的关联容器指定比较类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 8.了解如何把vector和string
- 下一篇: 11.考虑用排序的vector替代关联容