C++的vector

使用方法:

        创建
创建一个存储整数的空 vector
vector<int> myVector;     

创建一个包含 5 个整数的 vector,每个值都为默认值(0)
vector<int> myVector(5);          

创建一个包含 5 个整数的 vector,每个值都为 10
vector<int> myVector(5, 10);      

默认初始化一个空的 vector
vector<int> vec;              

初始化一个包含元素的 vector    
vector<int> vec2 = {1, 2, 3, 4};  
        添加
将整数 7 添加到 vector 的末尾
myVector.push_back(7);

效果上同,但更高效,推荐使用
myVector.emplace_back(10);

下标为1的位置插入100
myVector.insert(myVector.begin() + 1, 100);
        访问
获取第一个元素
int x = myVector[0] 

获取第二个元素
int y = myVector.at(1) 

返回第一个元素的引用
int m = myVector.front() 

返回最后一个元素的引用
int n = myVector.back()
        删除
删除第三个元素
myVector.erase(myVector.begin() + 2);

删除第三个 及 往后的所有元素
myVector.erase(myVector.begin() + 2,myVector.end());

清空 vector
myVector.clear();

        

        容量(可用于条件判断)
检查vector是否为空,即是否包含元素
myVector.empty();

返回vector中元素的数量
myVector.size();

返回vector能容纳的最大元素数量
myVector.max_size();

调整vector的容量以至少能容纳10个元素
myVector.reserve(10);

返回vector当前分配的以元素个数
myVector.capacity();

        

        遍历元素
返回指向逆向迭代的第一个元素的迭代器
rbegin();

返回指向逆向迭代的最后一个元素的迭代器之后的位置的迭代器
rend();

返回指向第一个元素的迭代器
begin();

返回指向最后一个元素之后的位置的迭代器
end();

for (auto it = myVector.begin(); it != myVector.end(); ++it) {
    std::cout << *it << " ";
}

for (int element : myVector) {
    std::cout << element << " ";
}

        特殊操作(排序颠倒查最值下标去重
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int main() {

	vector<int> v;
	cout << "初始vector\n";
	for (int i = 0; i < 10; i++) {
		v.emplace_back(i);
		//v.emplace_back(i % 3);可用于消除元素的测试
		cout << v[i] << '\t';
	}

	// 排序,sort默认升序,降序,需要传入第三个参数,如下
	sort(v.begin()+2, v.end()-2, [](int a, int b) {return a > b; });
	cout << "\n将第3个原素 到 倒数第3个元素 降序排序\n";
	for (auto it : v) {
		cout << it << "\t";
	}

	// 颠倒位置,没有自动排序的功能
	reverse(v.begin(), v.end());
	cout << "\n颠倒位置\n";
	for (auto it : v) {
		cout << it << "\t";
	}

	// 在指定范围找最值
	// 最小值
	cout << "\n最小值 : " << *min_element(v.begin(), v.end()) << endl;
	// 最大值
	cout << "最大值 : " << *max_element(v.begin(), v.end()) << endl;
	// 查找两个元素间的距离,一般获取最值下标
	cout << "最大值的下标:" << distance(v.begin(), max_element(v.begin(), v.end())) << endl;

	// 消除相邻的重复元素,需要与sort配合使用
	sort(v.begin(), v.end());
	v.erase(unique(v.begin(), v.end()), v.end());
	cout << "删除重复元素,且有序输出\n";
	for (auto it:v) {
		cout << it << "\t";
	}

    // 获取0在v中出现的次数
    count(v.begin(),v.end(),0);
    
    // find查找指定元素的位置,返回一个迭代器
    cout<<distance(v.begin(),find(v.begin(),v.end(),0));

	return 0;
}

unique函数将相邻的重复元素全部放到vector尾部,最后返回第一个重复元素所在位置的迭代器,因此,v.erase(unique(v.begin(), v.end()), v.end())将删除从该位置往后的所有元素,即可达到效果

C++ 中,vector 动态管理内部元素的内存分配和释放时的特点:

  1. 内存分配策略: 当元素数量达到当前分配的容量时,vector 会分配一个新的更大的内存块来存储现有元素和新添加的元素,然后将所有元素从旧内存块复制到新内存块,确保所有元素存储在连续的内存块中,保证元素的连续性不被破坏

  2. 动态内存管理: 使用 new 分配一个数据类型时,不会影响 vector 管理的内存块,除非 new 分配的内存恰好位于 vector 即将分配的新内存块的地址范围内。在现代操作系统中,内存管理器会确保分配的内存块不会相互冲突

  3. 空间预留: 频繁的内存重新分配可能会导致内存碎片和性能问题。为避免这种情况,vector 通常会预留超出当前需求的额外容量,以减少重新分配的次数

  4. 内存分配器vector 使用分配器(allocator)来处理内存分配和释放。分配器负责跟踪空闲内存,并确保新分配的内存块不会与其他内存块冲突

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值