一、 vector 删除元素
1、vector 容器尾部 删除 元素 - pop_back 函数
- 调用 push_back 函数 , 可以在 vector 容器尾部插入元素 ; 在下面的函数原型中 , 将 val 添加到 vector 容器的末尾 ;
void push_back(const value_type& val);
- 调用 pop_back 函数 , 可以在 vector 容器尾部删除元素 ; 在下面的函数原型中 , 该函数用于删除 vector 容器中的最后一个元素
void pop_back();
2、删除 vector 容器所有元素 - clear 函数
clear 函数 是 std::vector 容器的一个成员函数 , 用于移除容器中的所有元素 , 并释放元素占用的内存 ;
std::vector#clear() 函数原型如下 :
void clear() noexcept;
该函数没有 参数 和 返回值 , 当调用 clear 函数时 , 会删除 std::vector 容器中的所有元素 , 并使容器的 size 成员变量变为 0 ;
特别注意 : clear 函数 不会改变容器的 capacity 容量 ;
std::vector 调用 capacity() 函数 , 可以获取容量 , 容量是指容器在内存中分配的空间大小 , 可以容纳的元素数量 ; 当容器中的元素数量超过容量时 , 容器会自动进行扩容 , 分配更多的内存空间来容纳更多的元素 ;
代码示例 : 在下面的函数中 , 调用 vector 容器的 clear 函数 , 清空了容器中的元素 , 容器大小变为 0 , 容器的容量仍然为 3 ;
#include "iostream"
using namespace std;
#include "vector"
// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
cout << "vector 容器中的元素 : ";
for (int i = 0; i < v.size(); i++)
{
// 输出单个元素
cout << v[i] << " ";
}
// 输出回车换行
std::cout << std::endl;
cout << " vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
// 输出回车换行
std::cout << std::endl;
}
int main() {
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3 };
// 打印 vector 容器中的元素
printV(vec);
// 清空容器中的元素
vec.clear();
// 打印 vector 容器中的元素
printV(vec);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
vector 容器中的元素 : 1 2 3
vector 容器大小 : 3 ; 容器容量 : 3
vector 容器中的元素 :
vector 容器大小 : 0 ; 容器容量 : 3
Press any key to continue . . .
3、删除 vector 容器指定 位置 元素 - erase 函数
iterator 迭代器类 的 erase 函数 删除 指定 索引位置 的元素 ;
iterator#erase() 函数原型如下 :
iterator erase( const_iterator pos );
该 erase() 函数 接受一个指向要删除的元素的常量迭代器作为参数 , 返回一个指向被删除元素之后元素的迭代器 ;
注意 : 返回的是 新的迭代器 , 需要重新使用变量接收该迭代器 , 之前的 迭代器 指向的仍然是被删除的元素 , 如果使用之前的迭代器获取数据 , 程序会崩溃 ;
代码示例 :
#include "iostream"
using namespace std;
#include "vector"
// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
cout << "vector 容器中的元素 : ";
for (int i = 0; i < v.size(); i++)
{
// 输出单个元素
cout << v[i] << " ";
}
// 输出回车换行
std::cout << std::endl;
cout << " vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
// 输出回车换行
std::cout << std::endl;
}
int main() {
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3 };
// 打印 vector 容器中的元素
printV(vec);
// 删除容器中第一个元素
vec.erase(vec.begin());
// 打印 vector 容器中的元素
printV(vec);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
vector 容器中的元素 : 1 2 3
vector 容器大小 : 3 ; 容器容量 : 3
vector 容器中的元素 : 2 3
vector 容器大小 : 2 ; 容器容量 : 3
Press any key to continue . . .
4、删除 vector 容器指定 范围 元素 - erase 函数
iterator 迭代器类 的 erase 函数 删除 指定 范围区间 的元素 ;
注意 : 迭代器 范围是一个 前闭后开 区间 , 下面的代码 只能删除 2 个元素 , 即 第一个和第二个元素 ;
// 删除容器中第一个和第二个元素
vec.erase(vec.begin(), vec.begin() + 2);
iterator#erase() 函数原型如下 :
iterator erase( const_iterator first, const_iterator last );
iterator#erase() 函数 接受两个指向要删除的元素的常量迭代器作为参数 , 返回一个指向被删除元素范围的结束位置之后的迭代器 ;
注意 : 返回的是 新的迭代器 , 需要重新使用变量接收该迭代器 , 之前的 迭代器 指向的仍然是被删除的元素 , 如果使用之前的迭代器获取数据 , 程序会崩溃 ;
代码示例 :
#include "iostream"
using namespace std;
#include "vector"
// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
cout << "vector 容器中的元素 : ";
for (int i = 0; i < v.size(); i++)
{
// 输出单个元素
cout << v[i] << " ";
}
// 输出回车换行
std::cout << std::endl;
cout << " vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
// 输出回车换行
std::cout << std::endl;
}
int main() {
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3 };
// 打印 vector 容器中的元素
printV(vec);
// 删除容器中第一个和第二个元素
vec.erase(vec.begin(), vec.begin() + 2);
// 打印 vector 容器中的元素
printV(vec);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
vector 容器中的元素 : 1 2 3
vector 容器大小 : 3 ; 容器容量 : 3
vector 容器中的元素 : 3
vector 容器大小 : 1 ; 容器容量 : 3
Press any key to continue . . .
5、代码示例 - 删除 vector 容器中的偶数元素
在下面的代码示例中 , 特别注意 , 元素删除后 返回的是 指向下一个元素位置的 新迭代器 , 新迭代器 需要 设置给 循环控制变量 ,
代码示例 :
#include "iostream"
using namespace std;
#include "vector"
// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
cout << "vector 容器中的元素 : ";
for (int i = 0; i < v.size(); i++)
{
// 输出单个元素
cout << v[i] << " ";
}
// 输出回车换行
std::cout << std::endl;
cout << " vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
// 输出回车换行
std::cout << std::endl;
}
int main() {
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 打印 vector 容器中的元素
printV(vec);
// 删除容器中第一个和第二个元素
// 此处 for 循环条件中, 不写 it++ , it++ 只能在特定条件下使用
for (vector<int>::iterator it = vec.begin(); it != vec.end();)
{
if (*it % 2 == 0)
{
// 元素删除后 返回的是 指向下一个元素位置的 新迭代器
// 这里需要将 新迭代器 设置给循环条件变量
it = vec.erase(it);
}
else
{
// 迭代器指向的元素不删除, 则继续向后循环遍历
++it;
}
}
// 打印 vector 容器中的元素
printV(vec);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
vector 容器中的元素 : 1 2 3 4 5 6 7 8 9 10
vector 容器大小 : 10 ; 容器容量 : 10
vector 容器中的元素 : 1 3 5 7 9
vector 容器大小 : 5 ; 容器容量 : 10
Press any key to continue . . .
使用 while 循环实现上述效果 :
代码示例 :
#include "iostream"
using namespace std;
#include "vector"
// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
cout << "vector 容器中的元素 : ";
for (int i = 0; i < v.size(); i++)
{
// 输出单个元素
cout << v[i] << " ";
}
// 输出回车换行
std::cout << std::endl;
cout << " vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
// 输出回车换行
std::cout << std::endl;
}
int main() {
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 打印 vector 容器中的元素
printV(vec);
// 删除容器中偶数元素
// 循环控制变量
vector<int>::iterator it = vec.begin();
// 判定循环条件 : 循环到末尾迭代器
while (it != vec.end())
{
if (*it % 2 == 0)
{
// 元素删除后 返回的是 指向下一个元素位置的 新迭代器
// 这里需要将 新迭代器 设置给循环条件变量
it = vec.erase(it);
}
else
{
// 迭代器指向的元素不删除, 则继续向后循环遍历
++it;
}
}
// 打印 vector 容器中的元素
printV(vec);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
vector 容器中的元素 : 1 2 3 4 5 6 7 8 9 10
vector 容器大小 : 10 ; 容器容量 : 10
vector 容器中的元素 : 1 3 5 7 9
vector 容器大小 : 5 ; 容器容量 : 10
Press any key to continue . . .
二、 vector 插入元素
1、vector 容器尾部 插入 元素 - push_back 函数
- 调用 push_back 函数 , 可以在 vector 容器尾部插入元素 ; 在下面的函数原型中 , 将 val 添加到 vector 容器的末尾 ;
void push_back(const value_type& val);
- 调用 pop_back 函数 , 可以在 vector 容器尾部删除元素 ; 在下面的函数原型中 , 该函数用于删除 vector 容器中的最后一个元素
void pop_back();
2、vector 容器 指定位置 插入 一个元素 - insert 函数
调用 insert 函数 , 向 vector 容器 指定位置 插入 一个元素 , 该函数 接受一个指向插入位置的常量迭代器和一个要插入的元素作为参数 , 返回一个指向插入位置之后元素的迭代器 ;
函数原型如下 :
iterator insert( const_iterator pos, const value_type& value );
注意 : 返回的是 新的迭代器 , 需要重新使用变量接收该迭代器 , 之前的 迭代器 指向的仍然是被删除的元素 , 如果使用之前的迭代器获取数据 , 程序会崩溃 ;
代码示例 :
#include "iostream"
using namespace std;
#include "vector"
// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
cout << "vector 容器中的元素 : ";
for (int i = 0; i < v.size(); i++)
{
// 输出单个元素
cout << v[i] << " ";
}
// 输出回车换行
std::cout << std::endl;
cout << " vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
// 输出回车换行
std::cout << std::endl;
}
int main() {
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3, 4, 5 };
// 打印 vector 容器中的元素
printV(vec);
// 获取首元素迭代器
std::vector<int>::iterator it = vec.begin();
// 向 2 索引位置插入 888 元素
vec.insert(it + 2, 888);
// 打印 vector 容器中的元素
printV(vec);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
vector 容器中的元素 : 1 2 3 4 5
vector 容器大小 : 5 ; 容器容量 : 5
vector 容器中的元素 : 1 2 888 3 4 5
vector 容器大小 : 6 ; 容器容量 : 7
Press any key to continue . . .
3、vector 容器 指定位置 插入 若干相同元素 - insert 函数
调用 insert 函数 , 向 vector 容器 指定位置 插入 若干相同元素 , 该函数 接受一个指向插入位置的常量迭代器和一个要插入的元素作为参数 , 返回一个指向插入位置之后元素的迭代器 ;
函数原型如下 :
iterator insert( const_iterator pos, size_type n, const value_type& value );
注意 : 返回的是 新的迭代器 , 需要重新使用变量接收该迭代器 , 之前的 迭代器 指向的仍然是被删除的元素 , 如果使用之前的迭代器获取数据 , 程序会崩溃 ;
代码示例 :
#include "iostream"
using namespace std;
#include "vector"
// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
cout << "vector 容器中的元素 : ";
for (int i = 0; i < v.size(); i++)
{
// 输出单个元素
cout << v[i] << " ";
}
// 输出回车换行
std::cout << std::endl;
cout << " vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
// 输出回车换行
std::cout << std::endl;
}
int main() {
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3, 4, 5 };
// 打印 vector 容器中的元素
printV(vec);
// 获取首元素迭代器
std::vector<int>::iterator it = vec.begin();
// 向 2 索引位置插入 3 个 888 元素
vec.insert(it + 2, 3, 888);
// 打印 vector 容器中的元素
printV(vec);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
vector 容器中的元素 : 1 2 3 4 5
vector 容器大小 : 5 ; 容器容量 : 5
vector 容器中的元素 : 1 2 888 888 888 3 4 5
vector 容器大小 : 8 ; 容器容量 : 8
Press any key to continue . . .
4、vector 容器 指定位置 插入 其它 vector 容器指定范围的元素 - insert 函数
调用 insert 函数 , 向 vector 容器 指定位置 插入 其它 vector 容器指定范围的元素 , 该函数 接受一个指向插入位置的常量迭代器和一个要插入的元素作为参数 , 返回一个指向插入位置之后元素的迭代器 ;
函数原型如下 :
template< class InputIt >
iterator insert( const_iterator pos, InputIt first, InputIt last );
注意 : 返回的是 新的迭代器 , 需要重新使用变量接收该迭代器 , 之前的 迭代器 指向的仍然是被删除的元素 , 如果使用之前的迭代器获取数据 , 程序会崩溃 ;
代码示例 :
#include "iostream"
using namespace std;
#include "vector"
// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
cout << "vector 容器中的元素 : ";
for (int i = 0; i < v.size(); i++)
{
// 输出单个元素
cout << v[i] << " ";
}
// 输出回车换行
std::cout << std::endl;
cout << " vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
// 输出回车换行
std::cout << std::endl;
}
int main() {
// 创建空的 vector 容器
std::vector<int> vec{
1, 2, 3, 4, 5 };
std::vector<int> vec2{
6, 7, 8, 9, 10 };
// 打印 vector 容器中的元素
printV(vec);
// 获取首元素迭代器
std::vector<int>::iterator it_begin = vec2.begin();
std::vector<int>::iterator it_end = vec2.end();
std::vector<int>::iterator it_pos = vec.begin();
// 向 vec 容器的 2 索引位置插入 另一个 vector 容器 vec2 指定范围区间 元素
vec.insert(it_pos, it_begin, it_end);
// 打印 vector 容器中的元素
printV(vec);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
vector 容器中的元素 : 1 2 3 4 5
vector 容器大小 : 5 ; 容器容量 : 5
vector 容器中的元素 : 6 7 8 9 10 1 2 3 4 5
vector 容器大小 : 10 ; 容器容量 : 10
Press any key to continue . . .