"partition"和“stable_partition”的思考
"partition"和“stable_partition”设计的目的是根据一个谓词而把容器分为两部分。可是他们具体的区别在哪里呢?下面我们来验证一下。
void elimDups(vector<string> &words) { sort(words.begin(), words.end()); auto it = unique(words.begin(),words.end()); words.erase(it, words.end()); for(auto &a : words) cout << a << " "; cout << endl; } void bigies_partition(vector<string> &words, std::size_t sz) { elimDups(words); auto pivot = partition(words.begin(),words.end(), [sz](const string &a){return a.size() < sz;}); for(auto a = words.begin(); a != pivot; ++a){ cout << *a << " "; } } void bigies_stable_partition(vector<string> &words, std::size_t sz) { elimDups(words); auto pivot = stable_partition(words.begin(),words.end(), [sz](const string &a){return a.size() < sz;}); for(auto a = words.begin(); a != pivot; ++a){ cout << *a << " "; } } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); vector<string> v{"aa", "c", "ffff","bb","dddddd","eee","aaa","bbb"}; vector<string> v1(v); cout << "partition:" << endl; bigies_partition(v1,3); cout << endl; vector<string> v2(v); cout << "stable_partition:" << endl; bigies_stable_partition(v2,3); cout << endl; return a.exec(); }
output:
partition aa aaa bb bbb c dddddd eee ffff aa c bb stable_partition aa aaa bb bbb c dddddd eee ffff aa bb c
可以发现,stable_partition除了根据谓词把容器划分为两部分,还可以保持容器原有元素的顺序。