北京西站到北京南站,华为手机价格一览表,广东省农业农村厅厅长,厦门比较有名的设计公司介绍完了string类的相关内容后#xff1a;C初阶#xff1a;适合新手的手撕string类#xff08;模拟实现string类#xff09; 接下来进入新的篇章#xff0c;容器vector介绍#xff1a; 文章目录 1.vector的初步介绍2.vector的定义#xff08;constructor#xff09;3.v…介绍完了string类的相关内容后C初阶适合新手的手撕string类模拟实现string类 接下来进入新的篇章容器vector介绍 文章目录 1.vector的初步介绍2.vector的定义constructor3.vector迭代器 iterator 4.vector的三种遍历4.1正常for循环4.2范围for循环4.3两种迭代器正向和反向 5.vector扩容相关resize和reserve5.2reserve()5.2resize() 6. vector 增删查改6.1push_back和pop_back6.2find、Insert、erase6.3swap 1.vector的初步介绍 翻译过来就是 vector是表示可变大小数组的序列容器就像数组一样vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问和数组一样高效。但是又不像数组它的大小是可以动态改变的而且它的大小会被容器自动处理本质讲vector使用动态分配数组来存储它的元素。当新元素插入时候这个数组需要被重新分配大小为了增加存储空间。其做法是分配一个新的数组然后将全部元素移到这个数组。就时间而言这是一个相对代价高的任务因为每当一个新的元素加入到容器的时候vector并不会每次都重新分配大小。vector分配空间策略vector会分配一些额外的空间以适应可能的增长因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何重新分配都应该是对数增长的间隔大小以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。因此vector占用了更多的存储空间为了获得管理存储空间的能力并且以一种有效的方式动态增长。与其它动态序列容器相比deque, list and forward_list vector在访问元素的时候更加高效在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作效率更低。比起list和forward_list统一的迭代器和引用更好 2.vector的定义constructor 默认构造函数explicit vector (const allocator_type alloc allocator_type())。这是默认构造函数它创建一个空的 std::vector 对象。如果提供了分配器allocator则使用提供的分配器否则使用默认分配器。填充构造函数explicit vector (size_type n, const value_type val value_type(), const allocator_type alloc allocator_type())。这个构造函数创建一个包含n 个元素的 std::vector每个元素的值都是 val 。同样地您可以选择提供一个分配器如果没有提供则使用默认分配器。范围构造函数template class InputIterator vector (InputIterator first, InputIterator last, const allocator_type alloc allocator_type())。这个构造函数使用迭代器范围[first, last) 中的元素来初始化 std::vector。这使得您可以使用另一个容器的一部分或全部元素来初始化 std::vector。复制构造函数vector (const vector x)。这个构造函数创建一个新的 std::vector并使用另一个 std::vector x 中的元素进行初始化
构造函数声明接口说明vector()重点无参构造vector(size_type n, const value_type val value_type())构造并初始化n个valvector(const vector x)重点拷贝构造vector(InputIterator first, InputIterator last)使用迭代器进行初始化构造
int main()
{vectorint v1;//空参构造vectorint v2(5, 1);//构造并初始化5个1vectorint v3(v2);//拷贝构造string s1(abc);vectorint v4(s1.begin(), s1.end());//使用迭代器进行初始化构造return 0;
}这里v4中都存的是ASCII码值 3.vector迭代器 iterator 迭代器说明begin获取第一个数据位置的iterator/const_iteratorend获取最后一个数据的下一个位置的iterator/const_iteratorrbegin获取最后一个数据位置的reverse_iterator 反向迭代器的移动方向是与正向迭代器相反的即 操作符会使迭代器向前移动而 -- 操作符会使迭代器向后移动rend获取第一个数据前一个位置的reverse_iterator 4.vector的三种遍历
4.1正常for循环
void test2()
{string s1(abc);vectorchar v(s1.begin(), s1.end());//使用迭代器进行初始化构造for (size_t i 0; i v.size(); i){cout v[i] ;}
}int main()
{test2();
}4.2范围for循环
void test3()
{string s1(abc);vectorint v(s1.begin(), s1.end());//这里用int不是charfor (auto e : v){cout e ;}
}int main()
{test3();
}4.3两种迭代器正向和反向
void test4()
{string s1(abc);vectorchar v(s1.begin(), s1.end());//使用迭代器进行初始化构造vectorchar::iterator it v.begin();//正向遍历while (it ! v.end()){cout *it ;it;}cout endl;vectorchar::reverse_iterator rit v.rbegin();//反向遍历while (rit ! v.rend()){cout *rit ;rit;//是不是--}//反向迭代器的移动方向是与正向迭代器相反的//即 操作符会使迭代器向前移动而 -- 操作符会使迭代器向后移动
}int main()
{test4();
}5.vector扩容相关resize和reserve
接口说明size获取数据个数capacity获取容量大小empty判断是否为空resize改变vector的sizereserve改变vector的capacity
capacity的代码在vs和g下分别运行会发现vs下capacity是按1.5倍增长的g是按2倍增长的。不要固化的认为vector增容都是2倍具体增长多少是根据具体的需求定义的。vs是PJ版本STLg是SGI版本STL。reserve只负责开辟空间如果确定知道需要用多少空间reserve可以缓解vector增容的代价缺陷问题。resize在开空间的同时还会进行初始化影响size
5.2reserve() reserve 函数用于改变容器的容量即修改容器内部用于存储元素的空间大小。这个函数可以用来避免多次重新分配内存的开销从而提高性能。但需要注意的是reserve 只会增加容器的容量而不会影响容器的大小 void test5()
{vectorint v(10, 1);//10个1cout v.capacity() endl;v.reserve(20);cout v.capacity() endl;v.reserve(15);cout v.capacity() endl;v.reserve(5);cout v.capacity() endl;
}int main()
{test5();
}5.2resize() resize 函数用于改变容器的大小即修改容器中元素的数量。如果将 resize 函数的参数设置为比当前大小小的值那么容器将缩小到指定的大小并丢弃多余的元素。如果将参数设置为比当前大小大的值那么容器将增大到指定的大小并且新元素不指明的话将被默认构造对于内置类型新元素将被初始化为 0 void test6()
{vectorint v(10, 1);//10个1cout capacity: v.capacity() size: v.size() endl;v.resize(20);cout capacity: v.capacity() size: v.size() endl;v.resize(15);cout capacity: v.capacity() size: v.size() endl;v.resize(5);cout capacity: v.capacity() size: v.size() endl;
}int main()
{test6();
}6. vector 增删查改
接口说明push_back尾部插入元素pop_back尾部删除元素find查找元素insert在指定位置插入元素erase删除指定位置的元素swap交换两个 vector 的数据空间operator[]像数组一样使用下标访问元素
6.1push_back和pop_back void test7()
{vectorint v(10, 1);//10个1for (auto e : v){cout e ;}cout endl;v.push_back(10);for (auto e : v){cout e ;}cout endl;v.pop_back();for (auto e : v){cout e ;}cout endl;
}int main()
{test7();
}6.2find、Insert、erase
find 形式iterator find (iterator first, iterator last, const T val);参数说明first 和 last 表示查找范围的起始和结束迭代器val 是要查找的值作用在指定范围内查找指定的值并返回第一个匹配元素的迭代器 insert 形式iterator insert (iterator position, const T val);参数说明position 表示插入位置的迭代器val 是要插入的值作用在指定位置之前插入一个元素 erase 形式iterator erase (iterator position); 和 iterator erase (iterator first, iterator last);参数说明position 表示要删除的位置的迭代器first 和 last 表示要删除的范围的起始和结束迭代器作用删除指定位置的元素或者指定范围内的元素
void test8()
{vectorint v;for (int i 1; i 6; i){v.push_back(i);}for (auto e : v){cout e ;}cout endl;vectorint::iterator it find(v.begin(), v.end(), 3);//找到3的位置v.insert(it, 0);//插入for (auto e : v){cout e ;}cout endl;v.erase(v.begin(),v.end());//全删了for (auto e : v){cout e ;}cout endl;
}int main()
{test8();
}6.3swap
swap
形式void swap (vector x);参数说明x 是另一个 vector作用交换两个 vector 的数据空间使它们的内容互相交换
void test9()
{vectorint v1;for (int i 1; i 6; i){v1.push_back(i);}vectorint v2(10, 1);cout 还没交换 endl;for (auto e : v1){cout e ;}cout endl;v1.swap(v2);//二者交换cout 交换后 endl;for (auto e : v1){cout e ;}cout endl;
}int main()
{test9();
}常用的接口就这些了下次就来进行模拟实现了感谢大家支持