探测器 东莞网站建设,建站网站加盟,做网站域名哪里来,网站建设需要上税吗一、前言vector 是封装动态数组的顺序容器#xff0c;连续存储数据#xff0c;所以我们不仅可以通过迭代器访问存储在 vector 容器中的数据#xff0c;还能用指向 vector 容器中的数据的常规指针访问数据。这意味着指向 vector 容器中的数据的指针能传递给任何期待指向数组元…一、前言vector 是封装动态数组的顺序容器连续存储数据所以我们不仅可以通过迭代器访问存储在 vector 容器中的数据还能用指向 vector 容器中的数据的常规指针访问数据。这意味着指向 vector 容器中的数据的指针能传递给任何期待指向数组元素的指针的函数。vector 容器的存储是自动管理的按需扩张收缩。vector 容器通常占用多于静态数组的空间因为要分配更多内存以管理将来的增长。 vector 容器增长不是在原空间之后接新空间而是找更大的内存空间然后将已有数据拷贝到新空间释放原空间vector 容器所用的增长方式不是在每次插入元素时而是在额外空闲内存耗尽时重分配。vector 容器是类模板可以存储内置数据类型例如charintfloat 等自定义数据类型也可以 vector 容器嵌套容器。使用时包含头文件 vectortemplateclass T, class Allocator allocatorT
class vector {// 代码块
}vector 容器的迭代器是支持随机访问的迭代器。例如vectorint::iterator it v.begin();
cout *(it 2) endl; //访问 v 中下标为 2 的元素二、 vector 容器类函数构造函数vector();功能默认构造函数形数返回值vector(const vector right);功能拷贝构造函数形参right 另一个 vector 容器对象的常引用返回值vector(iterator first, iterator last);功能创建一个vector 容器对象并将 [first, last) 区间的元素拷贝到这个 vector 容器对象中形参first 起始迭代器lsat 末尾迭代器注意这个末尾迭代器的元素是没有被拷贝到这个 vector 容器对象中的返回值vector(const size_type count, const T val);功能创建一个 vector 容器对象并将 count 个 T 类型数据拷贝到这个 vector 容器对象中形参count 数量val T类型数据的引用T是模板参数返回值vector_constructor.cpp#include iostream
#include vector
using namespace std;int main(int argc, char *argv[])
{vectorint v1; //调用默认构造函数v1.push_back(1);v1.push_back(2);cout ---- v1 容器 ----- endl;for (vectorint::iterator it v1.begin(); it ! v1.end(); it)cout *it endl;vectorint v2(v1); //调用拷贝构造函数cout ---- v2 容器 ----- endl;for (vectorint::iterator it v2.begin(); it ! v2.end(); it)cout *it endl;vectorint v3(v1.begin(), v1.end()); //调用 vector(iterator first, iterator last);cout ---- v3 容器 ----- endl;for (vectorint::iterator it v3.begin(); it ! v3.end(); it)cout *it endl;vectorint v4(3, 100); //调用 vector(const size_type count, const int val);cout ---- v4 容器 ----- endl;for (vectorint::iterator it v4.begin(); it ! v4.end(); it)cout *it endl;return 0;
}迭代器begin(); cbegin(); //返回指向起始迭代器cbegin(); C11标准加入的end(); cend(); //返回指向末尾的迭代器cend(); C11标准加入的rbegin(); crbegin(); //返回指向起始的逆向迭代器crbegin(); C11标准加入的rend(); crend(); //返回指向末尾的逆向迭代器crend(); C11标准加入的vector_iterator.cpp#include iostream
#include vector
using namespace std;int main(int argc, char *argv[])
{vectorint v;v.push_back(0);v.push_back(1);v.push_back(2);v.push_back(3);cout *begin *(v.begin()) endl;cout *cbegin *(v.cbegin()) endl;cout *rbegin *(v.rbegin()) endl;cout *crbegin *(v.crbegin()) endl;return 0;
}赋值操作operatorvector operator(const vector right);功能将右值 right 容器对象中的所有元素赋值给这个 vector 容器对象左值形参right 另一个 vector 容器对象的常引用返回值被赋值的 vector 容器对象的引用assignvoid assign(iterator first, iterator last);功能将 [first, last) 区间的元素赋值给这个 vector 容器对象形参first 起始迭代器last 末尾迭代器注意这个末尾迭代器的元素是没有被赋值给这个 vector 容器对象中的返回值voidvoid assign(const size_type count, const T val);功能将 count 个 T 类型数据赋值给这个 vector 容器对象形参count 数量val T 类型数据的引用T是模板参数返回值voidvector_assign.cpp#include iostream
#include vector
using namespace std;int main(int argc, char *argv[])
{vectorint v1;v1.push_back(1);v1.push_back(2);cout ---- v1 容器 ---- endl;for (vectorint::iterator it v1.begin(); it ! v1.end(); it)cout *it endl;vectorint v2;v2 v1; //调用 vector operator(const vector right);cout ---- v2 容器 ---- endl;for (vectorint::iterator it v2.begin(); it ! v2.end(); it)cout *it endl;vectorint v3;v3.assign(v1.begin(), v1.end()); //调用 void assign(iterator first, iterator last);cout ---- v3 容器 ---- endl;for (vectorint::iterator it v3.begin(); it ! v3.end(); it)cout *it endl;vectorint v4;v4.assign(3, 100); //调用 void assign(const size_type count, const int val);for (vectorint::iterator it v4.begin(); it ! v4.end(); it)cout *it endl;return 0;
}元素访问atT at(const size_type pos);功能访问指定下标的元素普通对象调用这个函数形参pos 要返回的元素的下标返回值指定下标元素的引用const T at(const size_type pos) const;功能访问指定下标的元素常对象调用这个函数形参pos 要返回的元素的下标返回值指定下标元素的常引用operator[]T operator[](const size_type pos);功能访问指定下标的元素普通对象调用这个函数形参pos 要返回的元素的下标返回值指定下标元素的引用const T operator[](const size_type pos) const;功能访问指定下标的元素常对象调用这个函数形参pos 要返回的元素的下标返回值指定下标元素的常引用frontT front();功能访问第一个元素普通对象调用这个函数形参返回值第一个元素的引用const T front() const;功能访问第一个元素常对象调用这个函数形参返回值第一个元素的常引用backT back();功能访问最后一个元素普通对象调用这个函数形参返回值最后一个元素的引用const T back() const;功能访问最后一个元素常对象调用这个函数形参返回值最后一个元素的常引用dataT* data();功能返回指向存储元素工作的底层数组的指针指针满足范围 [data(), data() size()) 。普通对象调用这个函数形参返回值指向存储元素工作的底层数组的指针const T* data() const;功能返回指向存储元素工作的底层数组的指针指针满足范围 [data(), data() size()) 。常对象调用这个函数形参返回值指向存储元素工作的底层数组的常量指针vector_visit.cpp#include iostream
#include vector
using namespace std;int main(int argc, char *argv[])
{vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);const vectorint cv(v);cout ---- at ---- endl;cout v[0] v.at(0) endl; //调用 int at(const size_type pos);//cout v[3] v.at(3) endl; //越界会报 已放弃(吐核)cout cv[2] cv.at(2) endl; //调用 const int at(const size_type pos) const;cout endl;cout ---- operator[] ---- endl;cout v[0] v[0] endl; //调用 int operator[](const size_type pos);//cout v[3] v[3] endl; //越界会报 已放弃(吐核)cout cv[2] cv[2] endl; //调用 const int operator[](const size_type pos) const;cout endl;cout ---- front ---- endl;cout v 第一个元素 v.front() endl; //调用 int front();cout cv 第一个元素 v.front() endl; //调用 const int front() const;cout endl;cout ---- back ---- endl;cout v 最后一个元素 v.back() endl; //调用 int back();cout cv 最后一个元素 v.back() endl; //调用 const int back() const;cout endl;cout ---- data ---- endl;cout ---- v ---- endl;for (int *p v.data(); p v.data() v.size(); p) //调用 int* data();cout *p endl;cout ---- cv ---- endl;for (const int *p cv.data(); p cv.data() cv.size(); p) //调用 const int* data() const;cout *p endl;return 0;
}容量emptybool empty() const;功能判断容器是否为空形参返回值若容器为空返回 true否则返回 falsesizesize_type size() const;功能返回容器中元素个数形参返回值容器中元素个数resizevoid resize(const size_type newsize);功能设置容器的元素个数为 newsize 个 如果 newsize size()什么都不做 如果 newsize size() 则尾部插入 newsize - size() 个默认的元素比如 int 元素默认0 如果 newsize size() 则留下以首元素开始的前 newsize 个元素后面的都会被擦除掉形参newsize 容器新的元素个数返回值void resize(const size_type newsize, const T val)功能设置容器的元素个数为 newsize 个 如果 newsize size()什么都不做 如果 newsize size() 则尾部插入 newsize - size() 个值为 val 的元素 如果 newsize size() 则留下以首元素开始的前 newsize 个元素后面的都会被擦除掉形参容器新的元素个数返回值max_sizesize_type max_size() const;功能返回根据系统或库实现限制的容器可存储的元素最大数量形参返回值根据系统或库实现限制的容器可存储的元素最大数量reservevoid reserve(const size_type new_capacity);功能增加容器的容量到 new_capacity如果 new_capacity 大于当前的 capacity()则分配新空间并把原有的元素拷贝到新空间释放原空间否则该方法什么也不做形参new_capacity 新容量值返回值capacitysize_type capacity() const;功能返回当前存储空间能够容纳的元素个数形参返回值当前存储空间能够容纳的元素个数shrink_to_fitvoid shrink_to_fit(); 注意C11标准加入功能请求移除容器中未使用的容量请求是否能达成依赖实现形参返回值vector_capacity.cpp#include iostream
#include vector
using namespace std;#define MAX 4int main(int argc, char *argv[])
{vectorint v;for (int i 0; i MAX; i)v.push_back(i);vectorint vm;cout ---- v ---- endl;for (vectorint::iterator it v.begin(); it ! v.end(); it)cout *it ;cout endl;cout ---- vm ---- endl;for (vectorint::iterator it vm.begin(); it ! vm.end(); it)cout *it ;cout endl;cout endl;cout ---- empty ---- endl;if (v.empty())cout v is empty. endl;else cout v isnt empty. endl;if (vm.empty())cout vm is empty. endl;else cout vm isnt empty. endl;cout endl;cout ---- max_size ---- endl;cout v max_size v.max_size() endl;cout vm max_size vm.max_size() endl;cout endl;cout ---- size ---- endl;cout v size v.size() endl;cout vm size vm.size() endl;cout endl;cout ---- capacity ---- endl;cout v capacity v.capacity() endl;cout vm capacity vm.capacity() endl;v.reserve(100);vm.reserve(100);cout ---- after reserve new capacity 100 ---- endl;cout v capacity v.capacity() endl;cout vm capacity vm.capacity() endl;v.reserve(50); //比当前 capacity() 小什么都不做vm.reserve(50); //比当前 capacity() 小什么都不做cout ---- after reserve new capacity 50 ---- endl;cout v capacity v.capacity() endl; cout vm capacity vm.capacity() endl;v.shrink_to_fit();vm.shrink_to_fit();cout ---- after shrink_to_fit ---- endl;cout v capacity v.capacity() endl;cout vm capacity vm.capacity() endl;v.resize(8);cout ----after v.resize(8) v ---- endl;for (vectorint::iterator it v.begin(); it ! v.end(); it)cout *it ;cout endl;vm.resize(8, 10);cout ----after vm.resize(8, 10) vm ---- endl;for (vectorint::iterator it vm.begin(); it ! vm.end(); it)cout *it ;cout endl;cout ---- capacity ---- endl;cout v capacity v.capacity() endl;cout vm capacity vm.capacity() endl;v.resize(2); //从 8 个元素resize 到 2 个会留下从首元素开始的前 2 个元素cout ----after v.resize(2) v ---- endl;for (vectorint::iterator it v.begin(); it ! v.end(); it)cout *it ;cout endl;vm.resize(2, 5); //从 8 个元素resize 到 2 个会留下从首元素开始的前 2 个元素cout ----after vm.resize(2, 5) vm ---- endl;for (vectorint::iterator it vm.begin(); it ! vm.end(); it)cout *it ;cout endl;cout ---- capacity ---- endl;cout v capacity v.capacity() endl;cout vm capacity vm.capacity() endl;return 0;
}操作push_backvoid push_back(const T val);功能添加数据到容器末尾形参val T 类型数据的常引用T 是模板参数返回值pop_backvoid pop_back();功能删除容器的末元素形参返回值clearvoid clear();功能清空容器所有元素。调用这个函数后 size() 返回 0形参返回值eraseiterator erase(iterator pos); //C11标准前iterator erase(const_iterator pos); //C11 标准起功能删除位于 pos 位置的元素 形参pos 指向要删除元素的迭代器返回值后随被删除元素的迭代器1. 如果 pos 指向末元素则返回 end() 迭代器2. 如果删除不存在的元素会报段错误iterator erase(iterator first, iterator last); //C11 标准前iterator erase( const_iterator first, const_iterator last ); //C11 标准起功能删除位于 [first, last) 区间的元素形参first 要删除元素区间的起始迭代器last 要删除元素区间的末尾迭代器返回值后随最后被删除元素的迭代器1. 如果 last end()则返回更新后的 end() 迭代器2. 如果 [first, last) 为空范围则返回 last 迭代器iterator insert(iterator pos, const T val);功能在 pos 位置前插入元素void insert(iterator pos, size_type count, const T val);功能在 pos 位置前插入 count 个 valvoid insert(iterator pos, InputIt first, InputIt last);功能在 pos 位置 插入 [first, last) 区间的所有元素void swap(vector right);功能将容器的内容与 right 的交换vector_operate.cpp#include iostream
#include vector
using namespace std;#define MAX 4int main(int argc, char *argv[])
{vectorint v;cout ---- push_back v ---- endl;for (int i 0; i MAX; i){v.push_back(i1); //调用 void push_back(const T val);cout v[i] ;}cout endl;cout ---- after v.pop_back() v ---- endl;v.pop_back(); //调用 void pop_back();for (vectorint::iterator it v.begin(); it ! v.end(); it)cout *it ;cout endl;cout ---- erase ---- endl;vectorint::iterator eraseIt v.begin() 1;v.erase(eraseIt); //调用 iterator erase(iterator pos);cout ---- after erase(v.begin() 1) v ---- endl;for (vectorint::iterator it v.begin(); it ! v.end(); it)cout *it ;cout endl;//v.erase(v.end()); 删除不存在的元素报段错误cout ---- after erase(v.begin(), v.end()) v ---- endl;v.erase(v.begin(), v.end()); //调用 iterator erase(iterator first, iterator last);for (vectorint::iterator it v.begin(); it ! v.end(); it)cout *it ;cout endl;cout ---- after insert(v.begin(), 1) v ---- endl;v.insert(v.begin(), 1); // iterator insert(iterator pos, const T val);for (vectorint::iterator it v.begin(); it ! v.end(); it)cout *it ;cout endl;cout ---- after insert(v.end(), 2) v ---- endl;v.insert(v.end(), 2); // iterator insert(iterator pos, const T val); for (vectorint::iterator it v.begin(); it ! v.end(); it)cout *it ;cout endl;cout ---- after insert(v.end(), 5, 100) v ---- endl;v.insert(v.end(), 5, 100); // void insert(iterator pos, size_type count, const T val);for (vectorint::iterator it v.begin(); it ! v.end(); it)cout *it ;cout endl;cout ---- after insert(v.end(), v.begin(), v.end()) v ---- endl;v.insert(v.end(), v.begin(), v.end()); // void insert(iterator pos, InputIt first, InputIt last);for (vectorint::iterator it v.begin(); it ! v.end(); it)cout *it ;cout endl;cout ---- swap ---- endl;vectorint v1;for (int i 0; i MAX; i)v1.push_back(i1);cout ---- before swap v1---- endl;for (vectorint::iterator it v1.begin(); it ! v1.end(); it)cout *it ;cout endl;v.swap(v1); // cout ---- after swap v---- endl;for (vectorint::iterator it v.begin(); it ! v.end(); it)cout *it ;cout endl;cout ---- after swap v1---- endl;for (vectorint::iterator it v1.begin(); it ! v1.end(); it)cout *it ;cout endl;v.clear(); // void clear();cout ---- after clear() v---- endl;for (vectorint::iterator it v.begin(); it ! v.end(); it)cout *it ;cout endl;return 0;
}三、vector 容器存储自定义数据假如我们有一个自定义的 People 类这个类中有两个公共数据分别是名字和年龄有多个人的数据需要存储在 vector 容器中示例如下vector_udt.cpp#include iostream
#include string
#include vector
using namespace std;class People
{public:People(const string name, const int age):m_name(name), m_age(age){}string m_name;int m_age;
};int main(int argc, char *argv[])
{People p1(a, 10);People p2(b, 20);People p3(c, 30);People p4(d, 40);People p5(e, 50);vectorPeople v;v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);for (vectorPeople::iterator it v.begin(); it ! v.end(); it)cout name it-m_name , age it-m_age endl;return 0;
}四、vector 容器嵌套容器vector 容器嵌套 vector 容器其实就是二维数组vector_dim.cpp#include iostream
#include vector
using namespace std;int main(int argc, char *argv[])
{vectorvectorint vv;vectorint v1;vectorint v2;vectorint v3;vectorint v4;for (int i 0; i 4; i){v1.push_back(i1);v2.push_back(i2);v3.push_back(i3);v4.push_back(i4);}vv.push_back(v1);vv.push_back(v2);vv.push_back(v3);vv.push_back(v4);for (vectorvectorint ::iterator itvv vv.begin(); itvv ! vv.end(); itvv){for (vectorint::iterator it itvv-begin(); it ! itvv-end(); it)cout *it ;cout endl;}return 0;
}五、循环访问 vector 容器的三种方式whileforfor_eachwhile依据迭代器vectorT::iterator itBegin v.begin();
vectorT::iterator itEnd v.end();
while(itBegin ! itEnd)
{//代码块itBegin;
}for依据迭代器for (vectorT::iterator it v.begin(); it ! v.end(); it)
{//代码块
}for_each依据头文件 algorithm 中提供的 for_each 函数void func_callback(const T val) //回调函数
{//代码块
}
for_each(v.begin(), v.end(), my_print);vector_loop.cpp#include iostream
#include vector
#include algorithm
using namespace std;void my_print(const int val)
{cout val endl;
}int main(int argc, char *argv[])
{vectorint v;for (int i 0; i 5; i)v.push_back(i);cout ---while print---- endl;vectorint::iterator itBegin v.begin();vectorint::iterator itEnd v.end();while(itBegin ! itEnd){cout *itBegin endl;itBegin;}cout ----for print---- endl;for (vectorint::iterator it v.begin(); it ! v.end(); it){cout *it endl;}cout ----for_each---- endl;for_each(v.begin(), v.end(), my_print);return 0;
}