使用push_back
- 除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);