STL中vector容器begin(),end(),push_back()等相关函数

本文深入解析了C++标准库中的vector容器的begin、end、push_back、pop_back、front、back等关键函数的用法与实现原理,通过实例演示如何灵活运用这些函数进行数据操作。

在定义一个vector容器(vector<int> vec;)后,有些函数需要知道其含义,比如:vec.begin(),vec.end(),vec.push_back()等等,现总结一下:

begin函数:

函数原型:

iterator begin();

const_iterator begin();

功能:

返回一个当前vector容器中起始元素的迭代器。

 

end函数:

函数原型:

iterator end();

const_iterator end();

功能:

返回一个当前vector容器中末尾元素的迭代器。


push_bach函数:

函数原型:

iterator push_bash();

功能:在容器的尾端插入一个数据


pop_back函数:

函数原型:

iterator pop_back();

功能:删除容器的尾端的数据


front函数:

函数原型:

reference front();

const_reference front();

功能:

返回当前vector容器中起始元素的引用。

 

back函数:

函数原型:

reference back();

const_reference back();

功能:

返回当前vector容器中末尾元素的引用。

 

实例:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
 vector<char> v1;
 vector<char>::iterator iter1;
 vector<char>::iterator iter2;
 v1.push_back('m');
 v1.push_back('n');
 v1.push_back('o');
 v1.push_back('p');
 
 cout << "v1.front() = " << v1.front() << endl;
 cout << "v1.back() = " << v1.back() << endl;

 

 iter1 = v1.begin();
 cout << *iter1 << endl;
 iter2 = v1.end()-1;    //注意v1.end()指向的是最后一个元素的下一个位置,所以访问最后一个元素

                        //的正确操作为:v1.end() - 1;
 cout << *iter2 << endl;
 return 0;
}

输出结果:

v1.front() = m

v1.back() = p

m

p

<think>我们讨论的是C++ STL中的vector容器push_backvector的成员函数,用于在vector的末尾添加一个元素。而append通常不是vector的成员函数,但在字符串处理中(如std::string)有append成员函数。对于vector,如果我们想要添加多个元素,可以使用insert或者使用循环多次调用push_back。此外,在C++11之后,我们还有emplace_back,它可以在容器尾部直接构造元素,避免不必要的拷贝或移动。但是,问题中提到了“append”,可能是指将另一个容器中的元素追加到当前vector中。在vector中,我们可以使用insert函数来追加另一个容器的元素,或者使用C++11中的范围插入。下面我将分别解释push_back和如何实现类似append的功能(即追加多个元素)。1. push_back:每次添加一个元素到vector的末尾。2.追加多个元素:可以使用vector的insert成员函数,或者使用循环多次调用push_back,但更高效的方式是使用insert或assign(如果覆盖的话)或者使用C++11的移动语义或范围插入。示例代码:```cpp#include<iostream> #include<vector>int main() {std::vector<int>vec1= {1,2,3};std::vector<int>vec2= {4,5,6};//使用push_back逐个添加for (int elem: vec2){vec1.push_back(elem);}//使用insert函数一次性添加多个元素//vec1.insert(vec1.end(), vec2.begin(), vec2.end());//输出vec1for(intelem :vec1) {std::cout<< elem<< "";}std::cout <<std::endl;return0; }```上述代码中,我们有两种方法将vec2的所有元素追加到vec1的末尾:-方法1:使用循环和push_back。这种方法简单,但可能不是最高效的,因为每次push_back可能导致重新分配(如果容量不足)。但现代STL实现中,vector在扩容时通常以指数级增长,因此平均效率还是可以接受的。-方法2:使用insert函数。该函数可以一次插入一个范围内的元素。它通常比循环push_back更高效,因为它可以预先知道要插入的元素数量,从而可能只进行一次内存分配(如果需要的话)。另外,C++11引入了emplace_back,它和push_back的区别在于:emplace_back直接在容器尾部构造元素,而不需要先创建临时对象再拷贝或移动。这对于非平凡类型(如自定义类)可能更高效。示例:```cpp#include<vector> #include<string> intmain(){std::vector<std::string> vec;vec.push_back(std::string("Hello")); //这里会创建一个临时string对象,然后移动(或拷贝)到vector中vec.emplace_back("World");//直接在vector中构造string,使用字符串字面量,避免临时对象return0; }```所以,总结如下:-push_back:添加一个元素(通过拷贝或移动)到vector末尾。-追加多个元素:使用insert函数(传入迭代器范围)或循环push_back(但insert通常更高效)。- emplace_back: C++11新增,用于在容器末尾直接构造元素,避免临时对象。如果问题中的“append”指的是像字符串那样追加,那么对于vector来说,我们可以使用insert来实现。相关问题:</think>### C++ `vector` 的 `push_back` 和 `append` 操作详解 在 C++ STL 中,`std::vector` 提供了 `push_back` 方法用于添加单个元素,但**没有内置的 `append` 方法**。要实现类似 `append` 的功能(批量添加元素),需要使用其他方法。以下是详细解决方案: #### 1. `push_back` - 添加单个元素 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3}; // 使用 push_back 添加单个元素 vec.push_back(4); vec.push_back(5); // 输出结果: 1 2 3 4 5 for (int num : vec) { std::cout << num << " "; } return 0; } ``` **特点**: - 每次添加一个元素 - 可能导致多次内存重新分配(当容量不足时) - 时间复杂度:均摊 O(1) #### 2. 实现 `append` 功能 - 批量添加元素 有四种常用方法实现批量添加: ##### 方法 1: 使用 `insert` (推荐) ```cpp std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2 = {4, 5, 6}; // 将 vec2 的所有元素添加到 vec1 末尾 vec1.insert(vec1.end(), vec2.begin(), vec2.end()); ``` ##### 方法 2: 使用范围构造函数 + 移动语义 (C++11) ```cpp std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2 = {4, 5, 6}; // 高效移动元素(避免复制) vec1.insert(vec1.end(), std::make_move_iterator(vec2.begin()), std::make_move_iterator(vec2.end())); ``` ##### 方法 3: 使用 `reserve` + `push_back` (预分配内存) ```cpp std::vector<int> vec = {1, 2, 3}; std::vector<int> newElements = {4, 5, 6}; // 预分配足够内存避免多次重分配 vec.reserve(vec.size() + newElements.size()); for (int elem : newElements) { vec.push_back(elem); } ``` ##### 方法 4: 使用 `std::copy` (算法库) ```cpp #include <algorithm> std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2 = {4, 5, 6}; // 使用算法库复制元素 std::copy(vec2.begin(), vec2.end(), std::back_inserter(vec1)); ``` ### 性能对比与选择建议 | 方法 | 适用场景 | 时间复杂度 | 内存分配 | |------|----------|------------|----------| | `push_back` | 添加单个元素 | O(1) 均摊 | 可能多次 | | `insert` | 批量添加 | O(n) | 通常 1 次 | | 移动语义 | 批量添加+避免复制 | O(n) | 通常 1 次 | | `reserve`+`push_back` | 已知数量的批量添加 | O(n) | 仅 1 次 | | `std::copy` | 与其他容器交互 | O(n) | 可能多次 | **最佳实践**: 1. 添加单个元素 → `push_back` 2. 添加另一个容器的所有元素 → `insert` 或移动语义 3. 添加多个已知元素 → `reserve` + 循环 `push_back` 4. 避免不必要的复制 → 使用移动语义(C++11+)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值