C++STL容器 – std::vector容器修改、元素操作总结 push_back,emplace_back,emplace,insert,erase,pop_back,clear,resize,swap
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
本文作者: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
修改于:2023年06月26日 20:35:56
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
52