现在的位置: 首页 > 综合 > 正文

C++容器:容器操作

2013年10月14日 ⁄ 综合 ⁄ 共 2819字 ⁄ 字号 评论关闭

1.容器位置操作:

c.begin() 返回一个迭代器,它指向容器 c 的第一个元素

c.end() 返回一个迭代器,它指向容器 c 的第一个元素

c.rbegin() 返回一个逆序迭代器,它指向容器 c 的最后一个元素

c.rend() 返回一个逆序迭代器,它指向容器 c 的第一个元素前面的位置

 

2.顺序容器添加元素操作:

注意:容器元素都是副本,被复制的原始值与新容器中的元素各不相关,此后,容器内元素值发生变化时,被复制的原值不会受到影响,反之亦然。

c.push_back(t)

在容器 c 的尾部添加值为 t 的元素。返回 void 类型 。

c.push_front(t)

在容器 c 的前端添加值为 t 的元素。返回 void 类型。

只适用于 listdeque 容器类型。

c.insert(p,t)

在迭代器 p 所指向的元素前面插入值为 t 的新元素。返回指向新添加元素的迭代器。

c.insert(p,n,t)

在迭代器 p 所指向的元素前面插入 n 个值为 t 的新元素。返回 void 类型。

c.insert(p,b,e)

在迭代器 p 所指向的元素前面插入由迭代器 be 标记的范围内的元素。返回 void 类型。

示例:

list<int> ilist;
for (size_t ix = 0; ix != 4; ++ix)

    ilist.push_front(ix);

 

 

3.顺序容器添加元素操作迭代器失效问题:

vectordeque 容器中添加元素时,可能会导致某些或全部迭代器失效。假设所有迭代器失效是最安全的做法。这个建议特别适用于由 end 操作返回的迭代器。在容器的任何位置插入任何元素都会使该迭代器失效。

可以在每次做完插入运算后重新计算迭代器值,以解决迭代器失效问题:

while (first != v.end()) {
    // do some processing
    first = v.insert(first, 42); // insert new value
    ++first; // advance first just past the element we added
}

 

4.顺序容器大小操作:

c.size() 返回容器 c 中的元素个数。返回类型为 c::size_type。

c.max_size() 返回容器 c 可容纳的最多元素个数,返回类型为 c::size_type。

c.empty() 返回标记容器大小是否为 0 的布尔值。

c.resize(n) 调整容器 c 的长度大小,使其能容纳 n 个元素,如果 n < c.size(),则删除多出来的元素;否则,添加采用值初始化的新元素。

c.resize(n,t) 调整容器 c 的长度大小,使其能容纳 n 个元素。所有新添加的元素值都为 t。

 

5.顺序容器大小操作迭代器失效问题:

resize 操作可能会使迭代器失效。在 vectordeque 容器上做 resize 操作有可能会使其所有的迭代器都失效。

对于所有的容器类型,如果 resize 操作压缩了容器,则指向已删除的元素迭代器失效。 

 

6.访问元素操作*使用前提:容器不为空

c.back()

返回容器 c 的最后一个元素的引用。如果 c 为空,则该操作未定义。

c.front()

返回容器 c 的第一个元素的引用。如果 c 为空,则该操作未定义。

c[n]

返回下标为 n 的元素的引用。

如果 n <0n >= c.size(),则该操作未定义。只适用于 vectordeque 容器。

c.at(n)
返回下标为 n 的元素的引用。如果下标越界,则该操作未定义。只适用于 vectordeque 容器。

示例:

 if (!ilist.empty()) {// 容器不为空

    list<int>::reference last2 = ilist.back();

    cout << svec.at(0);      // throws out_of_range exception

}

 

7.删除顺序容器内元素*使用前提:容器不为空

 

c.erase(p)

删除迭代器 p 所指向的元素。

返回一个迭代器,它指向被删除元素后面的元素。如果 p 指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置。如果 p 本身就是指向超出末端的下一位置的迭代器,则该函数未定义。

c.erase(b,e)

删除迭代器 be 所标记的范围内所有的元素。

返回一个迭代器,它指向被删除元素段后面的元素。如果 e 本身就是指向超出末端的下一位置的迭代器,则返回的迭代器也指向容器的超出末端的下一位置。

c.clear()

删除容器 c 内的所有元素。返回 void。

c.pop_back()

删除容器 c 的最后一个元素。返回 void。如果 c 为空容器,则该函数未定义。

c.pop_front()

删除容器 c 的第一个元素。返回 void。如果 c 为空容器,则该函数未定义。只适用于 listdeque 容器

示例:

while (!ilist.empty()) {// 容器不为空
    process(ilist.front()); // do something with the current top of ilist
   
ilist.pop_front();      // done; remove first element
}

 

8.删除顺序容器内元素操作迭代器失效问题:

erase、pop_frontpop_back 函数使指向被删除元素的所有迭代器失效。对于 vector 容器,指向删除点后面的元素的迭代器通常也会失效。而对于 deque 容器,如果删除时不包含第一个元素或最后一个元素,那么该 deque 容器相关的所有迭代器都会失效。

 

9.顺序容器的赋值操作:

c1 = c2

删除容器 c1 的所有元素,然后将 c2 的元素复制给 c1c1c2 的类型(包括容器类型和元素类型)必须相同。

c1.swap(c2)

交换内容:调用完该函数后,c1 中存放的是 c2 原来的元素,c2 中存放的则是 c1 原来的元素。c1c2 的类型必须相同。该函数的执行速度通常要比将 c2 复制到 c1 的操作快。要交换的容器的类型必须匹配:操作数必须是相同类型的容器,而且所存储的元素类型也必须相同。

c.assign(b,e)

重新设置 c 的元素:将迭代器 be 标记的范围内所有的元素复制到 c 中。be 必须不是指向 c 中元素的迭代器。

 

c.assign(n,t)

将容器 c 重新设置为存储 n 个值为 t 的元素。

 

 

10.顺序容器的赋值操作迭代器失效问题:

赋值和 assign 操作使左操作数容器的所有迭代器失效。swap 操作则不会使迭代器失效。完成 swap 操作后,尽管被交换的元素已经存放在另一容器中,但迭代器仍然指向相同的元素。

 

11.assign

和赋值操作符(=)的作用类似,但是赋值操作符(=)只适用于果两个容器类型相同,其元素类型也相同的情况;

assign则还可适用于两个容器类型不同,元素类型不相同但是相互兼容的情况。

示例:

slist1.assign(slist2.begin(), slist2.end());
slist1.assign(10, "Hiya!"); // 10 elements; each one is Hiya!

抱歉!评论已关闭.