您的位置:首页 > 编程语言 > C语言/C++

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

2015-09-05 17:08 357 查看
使用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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息