在C++中,vector是标准库提供的一个非常有用的容器类。它是一个动态数组,可以根据需要动态调整大小。它提供了方便的方法来管理和访问动态数组的元素。
目录
一、调用
使用vector时,你需要包含头文件< vector >。然后你可以使用vector模板类来创建一个vector对象,指定其中存储的元素类型。
例如,你可以创建一个vector对象来存储整数:
#include<vector>
#include<iostream>
using namespace std;
int main()
vector<int> v;
}
定义一个空vector,其值为int类型。vector<>的里面可以套int、char、string,包括用struct定义的类型(没听过struct请忽略)甚至vector自己。
二、使用
1、.size()函数
vector的size()函数是用来返回vector容器中元素的个数的。它的语法为:
size_type size() const;
其中,size_type是vector容器中元素个数的数据类型。
示例用法:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v={1,2,3,4,5};
cout<<"大小为"<<v.size()<<endl;
return 0;
}
上述示例中,通过size()函数获取到了vector容器中元素的个数,并将结果输出到屏幕上。
输出为:
2、插入函数
Ⅰ、.push_back()
vector的.push_back函数是用来在vector的末尾添加一个元素的。它的语法为:
void push_back(const T& value);
其中,T是vector存储的元素类型,value是要添加的元素。
该函数会将value的副本添加到vector的末尾。如果vector的容量已满,则会自动进行内存扩展。
示例用法:
#include<vector>
#include<iostream>
using namespace std;
int main() {
vector<int> v;
v.push_back(1); // 添加元素1
v.push_back(2); // 添加元素2
v.push_back(3); // 添加元素3
return 0;
}
在上述示例中,通过.push_back函数分别添加了元素1、2、3到v中。最终,v的元素是[1, 2, 3]。
Ⅱ、.insert()
C++的vector类提供了insert函数用于在指定位置插入元素。insert函数的语法如下所示:
iterator insert (iterator position, const value_type& val);
其中,position是一个迭代器,指向了插入位置之前的元素。val是要插入的元素的值。
下面是一个示例代码,演示了如何使用insert函数向vector插入元素:
容器值为:1 6 2 3 4 5
在上面的示例中,我们创建了一个包含1到5的vector。然后,我们使用insert函数在第二个位置插入了元素6。可以看到,插入函数将元素6正确地插入到了vector中。
3、vector的遍历以及输出
Ⅰ、下标遍历
可以使用下标运算符 []
来遍历 C++ 的 vector
。示例代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v;
v.push_back(10); // 添加元素10
v.push_back(20); // 添加元素20
v.push_back(30); // 添加元素30
int x=v.size();//x存放着v的长度
for(int i=0;i<x;i++){
cout<<v[i]<<" ";
}
return 0;
}
这段代码创建了一个 vector
对象 v,并使用整型数字初始化。然后使用 for
循环和下标运算符 []
遍历 v
的每个元素,并打印到屏幕上。
输出:
需要注意的是,使用下标遍历 vector
时要确保下标不越界,最好使用 size()
函数获取 vector
的大小来作为循环的终止条件。
Ⅱ、迭代器遍历
C++STL(Standard Template Library)提供了一组迭代器(iterators),用于遍历容器中的元素。迭代器提供了一种统一的访问容器中元素的方式,无论容器是顺序容器(如vector、list)、关联容器(如map、set)还是容器适配器(如stack、queue)。
迭代器分为输入迭代器(Input Iterator)、输出迭代器(Output Iterator)、正向迭代器(Forward Iterator)、双向迭代器(Bidirectional Iterator)和随机访问迭代器(Random Access Iterator)等五种类型,它们的功能和能力从弱到强逐渐增强。
使用迭代器可以通过以下步骤进行遍历容器中的元素:
-
获取容器的起始迭代器和终止迭代器,可以使用begin()和end()成员函数或者全局函数begin()和end()来获取。
-
使用迭代器变量从起始迭代器开始遍历到终止迭代器的前一个位置。迭代器可以使用自增运算符(++)来递增,获取当前元素可以使用解引用运算符(*)
①正向遍历
下面是一个使用迭代器正向遍历vector容器的示例代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
vector<int>::iterator it;//定义一个迭代器,名称为it
// 使用迭代器遍历容器
for (it=v.begin();it<v.end();it++) {
cout<< *it <<" ";
}
return 0;
}
在上述示例代码中,使用v.begin()获取vector的起始迭代器,使用v.end()获取vector的终止迭代器。然后通过for循环遍历容器中的元素,使用*it获取当前元素的值,并输出到标准输出流。
输出:
②反向遍历
代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
vector<int>::reverse_iterator rit;//定义一个反向迭代器,名称为rit
// 使用反向迭代器遍历容器
for (rit=v.rbegin();rit<v.rend();rit++) {
cout<< *rit <<" ";
}
return 0;
}
4、删除函数
Ⅰ、erase()
C++中,可以使用vector的erase()函数来删除指定位置的元素。erase()函数有两种使用方式:
- 删除单个元素:
vector_name.erase(iterator_position);
其中,vector_name
是要删除元素的vector名称,iterator_position
是一个迭代器,指向要删除的元素的位置。
- 删除一段元素:
vector_name.erase(iterator_start, iterator_end);
其中,vector_name
是要删除元素的vector名称,iterator_start
是一个迭代器,指向要删除的起始位置,iterator_end
是一个迭代器,指向要删除的结束位置的下一个位置。
下面是一个示例代码,演示如何使用erase()函数删除vector中的元素:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 删除第三个元素
numbers.erase(numbers.begin() + 2);
// 删除第二个到第四个元素
numbers.erase(numbers.begin() + 1, numbers.begin() + 4);
// 输出剩余的元素
for (int number : numbers) {
std::cout << number << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:
1 5
在上面的示例代码中,我们首先创建了一个包含5个整数的vector。然后,使用erase()函数删除了第三个元素(值为3)和第二个到第四个元素(值为2、4)。最后,使用循环遍历剩余的元素,并将它们输出到控制台上。
Ⅱ、pop_back()
C++的vector类中的pop_back()函数用于移除vector中最后一个元素。
该函数没有参数,也没有返回值。
用法示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
nums.pop_back(); // 移除最后一个元素
for (int num : nums) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
输出结果:
1 2 3 4
在示例中,我们定义了一个包含5个整数的vector nums。然后,我们使用pop_back()函数移除了最后一个元素,即数字5。最后,我们遍历了vector中的元素并输出结果,结果为1 2 3 4,最后一个元素已被移除。
三、总结
有很多好处:
-
简洁高效:使用向量可以将多个数据压缩成一个对象,节省内存空间。同时,向量操作使用矩阵运算,可以利用硬件加速,提高计算效率。
-
方便的索引和切片:向量中的元素可以通过索引和切片进行访问和操作。这样可以快速定位和操作需要的数据,提高效率。
-
多种数据结构支持:向量可以存储多种类型的数据,如数字、字符串、对象等。这样可以方便地处理不同类型的数据,并且可以进行数据类型转换。
-
简化代码:向量操作可以极大地简化代码。通过使用向量化操作,可以避免使用循环和条件语句,使代码更加清晰、简洁。
-
并行计算支持:向量操作可以方便地进行并行计算。现代计算机都支持向量指令集(如SIMD),可以同时对多个数据进行计算,提高计算效率。
-
扩展性强:向量操作可以灵活地处理不同规模的数据。无论是处理小规模的数据还是大规模的数据,向量操作都能满足需求,并且可以方便地进行扩展。
总之,向量操作可以简化代码、提高计算效率,并且具有较好的扩展性和灵活性。这使得向量成为处理数据的重要工具,在很多领域都有广泛的应用。
你学废了吗?