c++primer之顺序容器(添加元素)
2015-09-05 17:08
357 查看
使用push_back
除array和forward_list之外,每个顺序容器(包括string类型)都支持push_back。
对push_back的调用在container尾部创建了一个新的元素,将container的size增大了1。该元素的值为word的一个拷贝。container的类型可以是list、vector或deque。
string是一个字符容器,我们也可以用push_back在string末尾添加字符;
使用push_front
list、forward_list、deque容器支持名为push_front的操作,此操作将元素插入到容器头部。但是vector不支持push_front。
使用insert
insert成员提供了更一般的添加功能,它允许我们在容器中任意位置插入0个或多个元素。
每个insert函数都接受一个迭代器作为其第一个参数。迭代器指出了容器中什么位置放置新元素。
虽然某些容器不支持push_front操作,但它们对于insert操作并无类型的限制(插入开始位置)。因此我们可以将元素插入到容器的开始位置,但不必担心容器是否支持push_front。
在新标准下,接受元素个数或范围的insert返回指向一个新加入元素的迭代器。
使用emplace操作
emplace函数的参数根据元素的类型而变化,参数必须与元素类型的构造函数相匹配;
除array和forward_list之外,每个顺序容器(包括string类型)都支持push_back。
// 从标准输入读取数据,将每个单词放到容器末尾。 string word; while(cin >> word) container.push_back(word);
对push_back的调用在container尾部创建了一个新的元素,将container的size增大了1。该元素的值为word的一个拷贝。container的类型可以是list、vector或deque。
string是一个字符容器,我们也可以用push_back在string末尾添加字符;
void pluralize(size_t cnt, string &word) { if(cnt > 1) word.push_back('s'); //等价于word += 's' ; }
使用push_front
list、forward_list、deque容器支持名为push_front的操作,此操作将元素插入到容器头部。但是vector不支持push_front。
使用insert
insert成员提供了更一般的添加功能,它允许我们在容器中任意位置插入0个或多个元素。
每个insert函数都接受一个迭代器作为其第一个参数。迭代器指出了容器中什么位置放置新元素。
例: slist.insert(iter, "Hello!"); // 将"Hello"添加到iter之前的位置
虽然某些容器不支持push_front操作,但它们对于insert操作并无类型的限制(插入开始位置)。因此我们可以将元素插入到容器的开始位置,但不必担心容器是否支持push_front。
vector<string> svec; list<string> slist; // 等价于调用 slist.push_front("Hello"); slist.insert(slist.begin(), "Hello"); // vector不支持push_front,但我们可以插入到begin()之前 //警告:插入到vector末尾之外的任何位置都是很慢的 svec.insert(svec.begin(), "Hello"); //插入范围内元素 // 将10个元素插入到svec的末尾,并将所有元素初始化为string“Anna” svec/insert(svec.end(), 10, "Anna"); vector<string> v={"quasi", "simba", "frollo", "scar"}; // 将v的最后两个元素添加到slist的开始位置 slist.insert(slist.begin(), v.end() - 2, v.end()); slist.insert(slist.end(), {"these", "word", "will", "go"}); //运行时错误: 迭代器表示拷贝的范围,不能指向与目的位置相同的容器 slist.insert(slist.begin(), slist.begin(), slist.end());
在新标准下,接受元素个数或范围的insert返回指向一个新加入元素的迭代器。
list<string> lst; auto iter = lst.begin(); while(cin >> word) // 每步while循环将一个新元素插入到iter之前,将iter改变为新加入元素的位置 iter = lst.insert(iter, word); // 等价于调用push_front
使用emplace操作
// 在c的末尾构造一个Sale_data对象。 // 使用三个参数的Sales_data构造函数 c.emplace_back("987-0590353403", 25, 15.99); // 错误:没有接受三个参数的push_back版本 c.push_back("987-0590353403", 25, 15.99); //正确,创建一个临时的Sales_data对象传递给push_back c.push_back(Sales_data("987-0590353403", 25, 15.99));
emplace函数的参数根据元素的类型而变化,参数必须与元素类型的构造函数相匹配;
// iter指向c中一个元素,其中保存了Sales_data元素。 c.emplace_back(); // 使用Sales_data的默认构造函数 c.emplace(iter, "999-999999999"); // 使用Sales_data(string) // 使用Sales_data的接受一个ISBN、一个count和一个price的构造函数 c.emplace_front("987-0590353403", 25, 15.99);
相关文章推荐
- C++Primer笔记之关联容器的使用详解
- JavaScript利用append添加元素报错的解决方法
- Python中给List添加元素的4种方法分享
- 如何更好的利用《C++ Primer》学习C++?
- C++primer 第十章 单词转换程序 运行不了解决办法
- 头文件中包含const与非const对象
- 几个标准库类型的简单使用
- C++Primer _vector _习题3.13
- C++Primer _vector _习题3.14
- Sales_item.h (C++ Primer 第五版)
- forward_list未定义+=符号,而改用advance()函数改变迭代器
- C++ primer 笔记
- C++Primer学习笔记
- 重读c++primer (第五版) -- 引子
- (福利)”C++Primer笔记“和”Java经典入门笔记“
- C++复习学习提纲
- [C++ Primer]第一章 快速入门
- C++primer阅读笔记-重载运算与类型转换(可调用对象与function)
- C++primer 阅读笔记-模板与泛型编程(成员模板)
- C++primer 阅读笔记-模板与泛型编程(模板参数)