C++STL容器 – std::vector容器修改、元素操作总结 push_back,emplace_back,emplace,insert,erase,pop_back,clear,resize,swap
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++STL容器 – std::vector容器修改、元素操作总结 push_back,emplace_back,emplace,insert,erase,pop_back,clear,resize,swap
原文链接:https://www.stubbornhuang.com/1984/
发布于:2022年02月25日 10:41:41
修改于:2022年03月01日 14:19:33

1 std::vector操作函数
1.1 push_back
push_back的作用主要是将给定值添加到容器末尾。
pusk_back在执行压入操作时需要初始化一个新的元素,然后再将给定值拷贝到新元素中。
std::vector<int> myVector;
PrintVector(myVector);
// 末尾添加元素
for (int i = 0; i < 10; ++i)
{
// 先构造元素,再拷贝压入
myVector.push_back(i);
}
PrintVector(myVector);
结果:
0 1 2 3 4 5 6 7 8 9
1.2 emplace_back
emplace_back的作用主要是将给定值添加到容器末尾。
emplace_back函数在压入元素时就地构造元素,无需拷贝操作,与push_back函数相比理论上需要的内存空间越小,但是速度更快。
std::vector<int> myVector;
PrintVector(myVector);
// 末尾添加元素
for (int i = 0; i < 10; ++i)
{
// 就地构造元素,不进行赋值拷贝操作,理论上效率更高
myVector.emplace_back(i);
}
PrintVector(myVector);
结果:
0 1 2 3 4 5 6 7 8 9
1.3 insert
insert的作用主要是将元素插入到容器的指定位置。
insert函数可支持以下操作:
- 在指定位置前插入元素
- 在指定位置之前插入给定元素的指定数量副本元素
- 在指定位置之前插入初始化列表
- 在指定位置之前插入另一个std::vector迭代器指定范围的元素
1.3.1 在指定位置之前插入元素
std::vector<int> myVector{10,20,30};
PrintVector(myVector);
// 插入元素
myVector.insert(myVector.begin(), { 10,12 });
PrintVector(myVector);
结果:
10 20 30
10 12 10 20 30
1.3.2 在指定位置之前插入给定元素的指定数量副本元素
std::vector<int> myVector{10,20,30};
PrintVector(myVector);
// 插入元素
myVector.insert(myVector.begin(),3 ,1);
PrintVector(myVector);
结果:
10 20 30
1 1 1 10 20 30
1.3.3 在指定位置之前插入初始化列表
std::vector<int> myVector{10,20,30};
PrintVector(myVector);
// 插入元素
myVector.insert(myVector.begin(), {11,12,13});
PrintVector(myVector);
结果:
10 20 30
11 12 13 10 20 30
1.3.4 在指定位置之前插入另一个std::vector迭代器指定范围的元素
std::vector<int> myVector{10,20,30};
PrintVector(myVector);
std::vector<int> myVector1{ 11,12,30 };
PrintVector(myVector1);
// 插入元素
myVector.insert(myVector.end(), myVector1.begin(),myVector1.end()-1);
PrintVector(myVector);
结果:
10 20 30
11 12 30
10 20 30 11 12
1.4 erase
erase的作用主要是容器中删除元素。
erase函数支持:
- 从指定位置删除元素
- 从指定范围删除元素
1.4.1 从指定位置删除元素
std::vector<int> myVector{10,20,30};
PrintVector(myVector);
// 删除元素
myVector.erase(myVector.begin());
PrintVector(myVector);
结果:
10 20 30
20 30
1.4.2 从指定范围删除元素
std::vector<int> myVector{10,20,30,40,50,60,70,80};
PrintVector(myVector);
// 删除元素
myVector.erase(myVector.begin(),myVector.begin()+4);
PrintVector(myVector);
结果:
10 20 30 40 50 60 70 80
50 60 70 80
1.5 pop_back
pop_back的作用主要是移除容器中最后一个元素。
std::vector<int> myVector{10,20,30,40,50,60,70,80};
PrintVector(myVector);
myVector.pop_back();
PrintVector(myVector);
myVector.pop_back();
PrintVector(myVector);
myVector.pop_back();
PrintVector(myVector);
结果:
10 20 30 40 50 60 70 80
10 20 30 40 50 60 70
10 20 30 40 50 60
10 20 30 40 50
1.6 emplace
emplace的作用主要是直接在指定位置向容器插入元素,元素就地构造。如果所需位置已被现有元素占据,则插入的元素首先在另一个位置构造,然后移动分配到所需位置。
emplace在向容器中压入自定义类或者结构体时更容易体现性能,这里以cppreference上的例子为例:
#include <iostream>
#include <string>
#include <vector>
struct A {
std::string s;
A(std::string str) : s(std::move(str)) { std::cout << " constructed\n"; }
A(const A& o) : s(o.s) { std::cout << " copy constructed\n"; }
A(A&& o) : s(std::move(o.s)) { std::cout << " move constructed\n"; }
A& operator=(const A& other) {
s = other.s;
std::cout << " copy assigned\n";
return *this;
}
A& operator=(A&& other) {
s = std::move(other.s);
std::cout << " move assigned\n";
return *this;
}
};
int main()
{
std::vector<A> container;
// reserve enough place so vector does not have to resize
container.reserve(10);
std::cout << "construct 2 times A:\n";
A two { "two" };
A three { "three" };
std::cout << "emplace:\n";
container.emplace(container.end(), "one");
std::cout << "emplace with A&:\n";
container.emplace(container.end(), two);
std::cout << "emplace with A&&:\n";
container.emplace(container.end(), std::move(three));
std::cout << "content:\n";
for (const auto& obj : container)
std::cout << ' ' << obj.s;
std::cout << '\n';
}
结果:
construct 2 times A:
constructed
constructed
emplace:
constructed
emplace with A&:
copy constructed
emplace with A&&:
move constructed
content:
one two three
1.7 clear
clear函数主要作用是清空std::vector容器中所有元素。
std::vector<int> myVector{10,20,30,40,50,60,70,80};
PrintVector(myVector);
myVector.clear();
PrintVector(myVector);
结果:
10 20 30 40 50 60 70 80
1.8 resize
resize函数的作用主要是通过给定容器的大小调整容器大小。
如果当前容器的大小小于给定容器的大小,则通过附加默认元素扩充容器大小。
如果当前容器的大小大于给定容器的大小,则将现有容器大小调整到指定的容器大小。
1.8.1 如果当前容器大小小于给定容器大小
std::vector<int> myVector{10,20,30,40,50,60,70,80};
PrintVector(myVector);
myVector.resize(10);
PrintVector(myVector);
结果:
10 20 30 40 50 60 70 80
10 20 30 40 50 60 70 80 0 0
1.8.2 如果当前容器大小大于给定容器大小
std::vector<int> myVector{10,20,30,40,50,60,70,80};
PrintVector(myVector);
myVector.resize(5);
PrintVector(myVector);
结果:
10 20 30 40 50 60 70 80
10 20 30 40 50
1.9 swap
swap函数的作用主要是与其它容器交换内容。
std::vector<int> myVector{10,20,30,40,50,60,70,80};
PrintVector(myVector);
std::vector<int> myVector1{ 1,2,3,4,5,6,7,8 };
PrintVector(myVector1);
myVector.swap(myVector1);
PrintVector(myVector);
PrintVector(myVector1);
结果:
10 20 30 40 50 60 70 80
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
10 20 30 40 50 60 70 80
当前分类随机文章推荐
- C++ - C++使用cuda api获取当前GPU显卡的总共的显存容量、已使用显存容量、剩余显存容量 阅读3863次,点赞2次
- C++ - std::string与std::wstring相互转换 阅读1750次,点赞0次
- C++ - queue存储动态指针时正确释放内存 阅读5233次,点赞2次
- C++ – 字节数组byte[]或者unsigned char[]与long double的相互转换 阅读916次,点赞0次
- C++11 - 委托机制的实现TinyDelegate 阅读1320次,点赞0次
- C++ - 得到字符串中某个字符串出现的个数 阅读3842次,点赞2次
- C++ - std::string字符串格式化方法总结 阅读652次,点赞0次
- GCC/GG++中编译优化选项-O -O0 -O1 -O2 -O3 -Os -Ofast -Og -Oz各自的区别和作用 阅读3105次,点赞2次
- C++ - const修饰符与指针 阅读266次,点赞1次
- C++ - 格式化json字符串,方便展示json字符串的层次结构 阅读2575次,点赞0次
全站随机文章推荐
- Python - 判断一个字符串是否为json格式 阅读942次,点赞0次
- WordPress - admin_url()函数,获取网站管理后台url链接 阅读817次,点赞0次
- 资源分享 - Artificial Intelligence - A Modern Approach , Fourth Edition 英文高清PDF下载 阅读4092次,点赞0次
- Blender - 历史版本下载 阅读295次,点赞0次
- C++ - 使用宏区分不同系统平台、不同编译器、不同编译模式等编译期宏使用总结 阅读1207次,点赞0次
- OnnxRuntime – 模型部署笔记3,总结OnnxRuntime模型推理流程 阅读40次,点赞0次
- C++ 11 - final关键字简要介绍 阅读1881次,点赞0次
- 资源分享 - Game AI Pro 360 - Guide to Movement and Pathfinding 英文高清PDF下载 阅读1705次,点赞0次
- C++ - 在CTC解码算法后移除相邻重复和blank索引 阅读277次,点赞0次
- VPS - 使用XShell连接VPS 阅读3129次,点赞0次
评论
167