c++primer之顺序容器(添加元素)

使用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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MachineLP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值