std::list<std::string> names { "Jane", "Jim", "Jules", "Janet"}; names.push_front("Ian"); // Add string ("Ian") to the front of the list names.push_back("Kitty"); // Append string ("Kitty") to the end of the list这两个函数都有右值引用参数的版本,这种版本的函数会移动参数而不是从参数复制新的元素。它们显然要比其他使用左值引用参数的版本高效。然而,成员函数 emplace_front() 和 emplace_back() 可以做得更好:
names.emplace_front("Ian");//Create string ("Ian") in place at the front of the list names.emplace_back("Kitty");// Create string ("Kitty") in place at the end of the list这些成员函数的参数是调用以被生成元素的构造函数的参数。它们消除了 push_front() 和 push_back() 不得不执行的右值移动运算。
std::list<int> data(10, 55); // List of 10 elements with value 55 data.insert(++begin(data), 66); // Insert 66 as the second elementinsert() 的第一个参数是一个指定插入点的迭代器,第二个参数是被插入的元素。begin() 返回的双向迭代器自增后,指向第二个元素。上面的语句执行完毕后,list 容器的内容如下:
auto iter = begin(data); std::advance(iter, 9); // Increase iter by 9 data.insert(iter, 3, 88);// Insert 3 copies of 88 starting at the 10thiter 是 list<int>::iterator 类型。insert() 函数的第一个参数是用来指定插入位置的迭代器,第二个参数是被插入元素的个数,第三个参数是被重复插入的元素。为了得到第 10 个元素,可以使用定义在 iterator 头文件中的全局函数 advance(),将迭代器增加 9。只能增加或减小双向迭代器。因为迭代器不能直接加 9,所以 advance() 会在循环中自增迭代器。
std::vector<int> numbers(10, 5)/ // Vector of 10 elements with value 5 data.insert(--(--end(data)), cbegin(numbers), cend(numbers));insert() 的第一个参数是一个迭代器,它指向 data 的倒数第二个元素。第二和第三个参数指定了 number 中被插入元素的范围,因此从 data 中倒数第二个元素开始,依次插入 vector 的全部元素。代码执行后,data 中的内容如下:
std::list<std:: string> names {"Jane", "Jim", "Jules", "Janet"}; names.emplace_back("Ann"); std:: string name ("Alan"); names.emplace_back(std::move(name)); names.emplace_front("Hugo"); names.emplace(++begin(names), "Hannah");
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有