vector的用法

vector 底层实现的方式为一个顺序表 容量按照vs每次1.5倍的增张,gcc为2倍实现不同那么增长方式就不同

vector的构造方式

	vector<int> ar1{ 1,2,3,4,5,6,7,8,9 };
	vector<int> ar2(ar1.begin(), ar1.end());
	vector<int> ar3(10, 1);
	vector<int> ar4(ar2); //深拷贝
	Printf(ar2);
	Printf(ar3);

三种构造方式,第二个使用迭代器构造,将ar3初始化为10个1;
打印结果如下:
在这里插入图片描述

迭代器的使用 iterator

iterator由于比较复杂在C++11中使用auto关键字定义就行。
1)begin()返回的是第一个元素的地址
2)end()返回的是最后一个元素的下一个元素的位置(无效值)
3)rbegin()返回的是最后一个元素的位置
4)rend()返回的是第一个元素的前一个元素的位置(无效值)
5)对rbegin++相当于往后走,对rend++相当于往前走;

void TestIterator1()
{
	vector<int> ar1{ 1,2,3,4,5,6,7,8,9 };
	auto vi1 = ar1.begin();
	auto vi2 = ar1.end();
	auto vi3 = ar1.rbegin();
	auto vi4 = ar1.rend();
	cout << *vi1 << endl;
	cout << *vi2 << endl;
	cout << *vi3 << endl;
	cout << *vi4 << endl;
}

在这里插入图片描述

vector的增删查改

1)reserve 改变容量的大小
2)resize 改变有效值的个数,如果大于写了val则将多得值初始化为val,如果不写默认为0;
3)push_back 在末尾插一个元素,如果本来就每元素那么在debug下 会报错,最好还是判断一下;
4)pop_back 尾删,没啥说的
5)insert 在一个元素之前插另一个元素(见迭代器失效)

void Testalter()
{
	vector<int> ar1{ 1,2,3,4,5,6,7,8,9 };
	cout << ar1.capacity() << endl;
	ar1.reserve(40);
	cout << ar1.capacity()<<endl;
	cout << ar1.size() << endl;
	ar1.resize(20);
	cout << ar1.size() << endl;
	Printf(ar1);
	cout << endl;
	ar1.resize(50, 99);
	Printf(ar1);
}

在这里插入图片描述

迭代器的失效

当迭代器所在的元素被删除,原空间发生变化的时候就会发生迭代器的失效
下面的源码稍微复杂但是很简单!

void ittset() {
	
	vector<int> v = { 1,2,3,4,5,6,7,8,9 };
	vector<int> v1 = {99,99,99};
	auto vi = v.begin() + 1;
	vector<int>::iterator pos = find(v.begin(), v.end(), 3);
	v.erase(pos); //此时迭代器失效
	cout << *pos << endl; //bebug下会崩溃但是在rel版本下可以打出来,因为rel下没有内存检测
	cout << *vi<<endl;   
	vi = v.erase(vi);  //但是可以获取erase的返回值,如果获取的了那么得到的是vi原来位置元素的值
	cout << *vi << endl;
	vi=v.insert(v.begin() + 1, v1.begin(), v1.end());//获取vi现在的位置
	cout << *vi++ << endl;
	cout << *vi++ << endl;
	cout << ++*vi << endl;
	//insdert 和 erase 都会导致迭代器失效 那么可以获取其的返回值,获取的返回值为操作之后的位置。
}

rel下打出的值在这里插入图片描述
可以看见*vi在获取到返回值后可以继续使用。获取的返回值为新空间相对于的返回值

### 关于Vector数据结构的使用方法与示例 #### 1. C++ STL中的`std::vector` `std::vector` 是C++标准模板库(STL)中的一种动态数组容器,支持随机访问,并且可以在运行时调整大小。以下是其常用接口及使用示例: - **构造函数**:可以通过多种方式创建一个 `std::vector`。 ```cpp #include <vector> #include <iostream> int main() { // 创建空向量 std::vector<int> v1; // 使用初始值创建向量 std::vector<int> v2(5, 10); // 向量包含5个元素,每个元素值为10 // 从另一个向量复制 std::vector<int> v3(v2); return 0; } ``` - **增删改查操作**: ```cpp #include <vector> #include <iostream> int main() { std::vector<int> v = {1, 2, 3, 4, 5}; // 插入元素 v.push_back(6); // 在末尾插入元素6 [^1] // 删除元素 v.pop_back(); // 删除最后一个元素 [^1] // 修改元素 v[0] = 10; // 将第一个元素修改为10 [^1] // 查找元素 for (int i : v) { std::cout << i << " "; } return 0; } ``` #### 2. Spark MLlib中的`Vector` 在Spark MLlib中,`Vector` 是一种表示数值向量的数据结构,主要分为两种实现形式:`DenseVector` 和 `SparseVector`。以下是如何创建和使用这两种向量的示例: - **DenseVector**:存储所有元素,包括零值。 ```scala import org.apache.spark.ml.linalg.Vectors val dv: org.apache.spark.ml.linalg.Vector = Vectors.dense(1.0, 0.0, 3.0) [^2] ``` - **SparseVector**:仅存储非零元素,节省内存。 ```scala import org.apache.spark.ml.linalg.Vectors // 使用索引和值创建稀疏向量 val sv1: org.apache.spark.ml.linalg.Vector = Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)) [^2] // 使用键值对创建稀疏向量 val sv2: org.apache.spark.ml.linalg.Vector = Vectors.sparse(3, Seq((0, 1.0), (2, 3.0))) [^2] ``` #### 3. Java中的`Vector`类 Java中的`Vector`类是一个线程安全的动态数组实现,但由于其性能较低,通常推荐使用`ArrayList`替代。以下是其基本用法: - **创建和初始化**: ```java import java.util.Vector; public class Main { public static void main(String[] args) { Vector<Integer> vector = new Vector<>(); // 创建空向量 vector.add(1); // 添加元素 vector.add(2); System.out.println(vector); // 输出向量内容 [^4] } } ``` - **同步特性**: 由于每个方法都带有`synchronized`关键字,因此在多线程环境中可以安全使用,但会牺牲一定的性能。 #### 4. STL中`std::vector`的特点 `std::vector` 是STL中最常用的容器之一,具有动态扩展、随机访问等特性。它允许程序员通过简单的接口操作数据,同时提供高效的内存管理机制[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值