10.2 A First Look at the Algorithms(算法的初遇)
#include <iostream> #include <algorithm> #include <vector> #include <string> #include <numeric> using namespace std; int main() { vector<int> vec = { 1, 2, 3, 4 }; int sum = accumulate(vec.cbegin(), vec.cend(), 0); cout << "The Sum is: " << sum << endl; system("PAUSE"); return 0; }
accumulate()第三个参数为计算的初始值,使用时,在序列中的元素必须匹配或者可转换成第三个参数的类型。
#include <iostream> #include <algorithm> #include <vector> #include <string> #include <numeric> using namespace std; int main() { vector<string> vec = { "hei ", "ni ", "hao" }; string sum = accumulate(vec.cbegin(), vec.cend(), string("")); //若不转换,""默认为char *, const char[1] cout << "The Sum is: " << sum << endl; system("PAUSE"); return 0; }
10.2.2 Algorithms That Write Container Elements
调用fill_n(或者类似的写入元素算法),对一个空的容器调用迭代器写入元素。
#include <iostream> #include <algorithm> #include <vector> #include <string> #include <numeric> using namespace std; int main() { vector<int> vec = { 0, 1, 2, 3 }; //fill(vec.begin(), vec.end(), 9);都用9填充 fill_n(vec.begin(), vec.size(), 0); //用0填充vec中vec.size()个元素 for (auto &i : vec) { cout << i << " "; } system("PAUSE"); return 0; }
back_inserter对一个容器采用引用,并且返回一个插入迭代器绑定到容器,当我们通过这个迭代器赋值时,赋值将调用push_back去增加一个给定的值到容器当中。
#include <iostream> #include <algorithm> #include <vector> #include <string> #include <numeric> using namespace std; int main() { vector<int> vec = { 0, 1, 2, 3 }; auto iter = back_inserter(vec); *iter = 4; *iter = 5; for (auto &i : vec) { cout << i << " "; } system("PAUSE"); return 0; }
vector<int> vec = { 0, 1, 2, 3 }; auto iter = back_inserter(vec); fill_n(back_inserter(vec), 5, 6); //append six elements to vec
copy():
fill_n(begin(vec), sizeof(vec) / sizeof(int), 0);
for (auto &i : vec) {
cout << i << endl;
}
int a1[] = { 1, 2, 3 }; int a[sizeof(a1) / sizeof(*a1)]; auto co = copy(begin(a1), end(a1), a); for (int i = 0; i < (sizeof(a1) / sizeof(*a1)); ++i) { cout << a[i] << endl; } cout << *(co - 1) << endl; //co指向a2最后一个元素的后一位
vector<int> vec = { 10, 15, 16 }; vector<int> vec1; copy(vec.begin(), vec.end(), back_inserter(vec1));
在本章中提到,标准库算法不会改变他们所操作的容器大小。为什么使用back_inserter不会使这一断言失效?
总的来说就是迭代器的原因。标准库算法从来不直接操作容器,它们只操作迭代器,从而间接访问容器,能不能插入和删除元素,不在于算法,而在于传递给它们的迭代器是否具有这样的能力。
严格来说,标准库算法根本不知道又“容器”这个东西。
void elimDups(vector<string> &word) { sort(word.begin(), word.end()); //将容器元素按照字母顺序排序 auto end_unique = unique(word.begin(), word.end()); //将相同元素留一个,其它置空放最后。 word.erase(end_unique, word.end()); //删除重复元素,从end_unique1到word.end()前一元素 } int main() { vector<string> vec = { "hello", "ni", "ai", "ni", "wp", "hello", "ni" }; elimDups(vec); for (auto &i : vec) { cout << i << " "; }

浙公网安备 33010602011771号