項目44:コンテナのメンバー関数は同じ名前のアルゴリズムよりも優先されます
この条項に疑いの余地はありません。本に記載されている理由は次のとおりです。
1)メンバー関数は高速になる傾向があります。
2)メンバー関数は通常、コンテナー、特に連想コンテナーのコレクションに近いです。現時点では、アルゴリズムでは不可能なことですが、アルゴリズムは普遍的なものを処理します。
void listTest() {
// 成员函数
list<int> l1{1,9,7,6,4};
list<int> l2{2,8,3,5,};
l1.sort();
l2.sort();
// l1.merge(l2);
// 算法
list<int> l;
std::merge(l1.begin(), l1.end(), l2.cbegin(), l2.cend(), std::back_inserter(l));
return;
}
第45条:カウント、検索、binary_search、lower_bound、upper_bound、equal_rangeを正しく区別する
シーン1、間隔は無秩序です
シーン2、間隔は整然としています
シナリオ3、連想コンテナ
本のスクリーンショットに直接移動する
練習コード
void vectorTest() {
vector<int> vec{5, 5, 9, 7, 8, 6, 1, 2, 6, 7, 6, 3, 4};
// 无序场景的查找、计数
auto i1 = std::find(vec.cbegin(), vec.cend(), 6); // 使用 operator==
if (i1 != vec.cend()) {
// exist 6
} else {
// not exist 6
}
int num = std::count(vec.cbegin(), vec.cend(), 6); // 6的数量
auto i2 = std::find_if(vec.cbegin(), vec.cend(), [](int x) { return x == 6; }); // 是否存在6
// 有序场景的查找、计数
std::sort(vec.begin(), vec.end());
bool exist6 = std::binary_search(vec.cbegin(), vec.cend(), 6); // 是否存在6
auto il = std::lower_bound(vec.cbegin(), vec.cend(), 6);
if (il != vec.end() && *il == 6) {
// exist 6
// 特别说明,这儿的用法在别的地方可能有问题,*il == 6是相等性的判断,其实算法是等价性的判断
// 因此如果序列中是对象,排序规则中很可能只用到了部分成员,比如工号,而没有用到员工名字,则这样的相等判断是有问题的
// upper_bound同理
}
auto iu = std::upper_bound(vec.cbegin(), vec.cend(), 6);
int num6 = std::distance(il, iu); // 6的数量
auto ipair = std::equal_range(vec.cbegin(), vec.cend(), 6);
if (ipair.first != ipair.second) {
// exist 6
}
num6 = std::distance(ipair.first, ipair.second); // 6的数量
num6 = ipair.second - ipair.first; // 6的数量
// 有序场景针对某些位置的操作
vec.insert(vec.begin(), 0); // 仅测试,这个插入会导致顺序错误
vec.insert(std::lower_bound(vec.cbegin(), vec.cend(), 6), 20); // 仅测试,这个插入会导致顺序错误
std::sort(vec.begin(), vec.end());
vec.insert(std::upper_bound(vec.cbegin(), vec.cend(), 6), 20); // 仅测试,这个插入会导致顺序错误
std::sort(vec.begin(), vec.end());
vec.erase(vec.begin(), std::lower_bound(vec.cbegin(), vec.cend(), 5)); // 将5前面的元素都删除
vec.erase(std::upper_bound(vec.cbegin(), vec.cend(), 6), vec.end()); // 将6后面的元素都删除
return;
}