c++中为什么不提倡使用vector示例详解

vector< bool> 并不是一个STL容器,不是一个STL容器,不是一个STL容器!

首先vector< bool> 并不是一个通常意义上的vector容器,这个源自于历史遗留问题。
早在C++98的时候,就有vector< bool>这个类型了,但是因为当时为了考虑到节省空间的想法,所以vector< bool>里面不是一个Byte一个Byte储存的,它是一个bit一个bit储存的!

因为C++没有直接去给一个bit来操作,所以用operator[]的时候,正常容器返回的应该是一个对应元素的引用,但是对于vector< bool>实际上访问的是一个”proxy reference”而不是一个”true reference”,返回的是”std::vector< bool>:reference”类型的对象。

而一般情况情况下

vector< bool> c{ false, true, false, true, false };
bool b = c[0];
auto d = c[0]; 

对于b的初始化它其实暗含了一个隐式的类型转换。而对于d,它的类型并不是bool,而是一个vector< bool>中的一个内部类。

而此时如果修改d的值,c中的值也会跟着修改:

d = true;
for(auto i:c)
 cout << i << " ";
cout << endl;
//上式会输出1 1 0 1 0

而如果c被销毁,d就会变成一个悬垂指针,再对d操作就属于未定义行为。

而为什么说vector< bool>不是一个标准容器,就是因为它不能支持一些容器该有的基本操作,诸如取地址给指针初始化操作:

vector< bool> c{ false, true, false, true, false };
&tmp = c[0]; //错误,不能编译,对于引用来说,因为c[0]不是一个左值
bool *p = &c[0]; //错误,不能编译,因为无法将一个临时量地址给绑定到指针

我之前写过一篇Blog也是讲这个的:

谈vector的特殊性——为什么它不是STL容器

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

时间: 2019-08-11

C++中vector的用法实例解析

本文实例展示了C++中的vector用法,分享给大家供大家参考.具体如下: 一.概述 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小. 例如: // c语言风格 int myHouse[100] ; // 采用vector vector<int> vecMyHouse(100); 当如上定义后,vecMyHouse

详解C++中的vector容器及用迭代器访问vector的方法

vector vector是相同类型对象的集合.集合中的每个对象有个对应的索引.vector常被称为容器(container). 为了使用vector,需要: #include <vector> using std::vector; vector是一个类模版(class template).C++有函数模版和类模版.模版本身不是函数或类,必须通过指定 类型让编译器去实例化(instantiation)它.比如vector<int> ivec. vector是模版,不是类型.从vec

浅谈c++ vector和map的遍历和删除对象

示例如下: // Aa.cpp : Defines the entry point for the console application. #include "stdafx.h" #include <vector> #include <map> #include <iostream> using namespace std; int main(int argc, char* argv[]) { printf("Hello World!\n

c++ vector(向量)使用方法详解(顺序访问vector的多种方式)

vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器.vector 是C++ STL的一个重要成员,使用它时需要包含头文件: 复制代码 代码如下: #include<vector>; 一.vector 的初始化:可以有五种方式,举例说明如下: (1) vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的.(2)vector<int> a(10,

C++中vector容器的常用操作方法实例总结

1 获得容器最后一个元素  ------ 使用 back或rbegin 取得 // back.rbegin 有常量和引用两种形式 std::vector<int> myVector; myVector.back()=3; std::vector<int>::reverse_iterator tailIter; tailIter=myVector.rbegin(); *tailIter=3 2 删除某元素 需要删除某位置的元素,应使用iterator遍历, 不应使用at(i) 方式遍

C++实现 vector 的四则运算

这里假设 vector 的运算定义为对操作数 vector 中相同位置的元素进行运算,最后得到一个新的 vector.具体来说就是,假如 vector<int> d1{1, 2, 3}, d2{4, 5, 6};则, v1 + v2 等于 {5, 7, 9}.实现这样的运算看起来并不是很难,一个非常直观的做法如下所示: vector<int> operator+(const vector<int>& v1, const vector<int>&

C++从文本文件读取数据到vector中的方法

前言 大家应该都只奥vector(向量)是 C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.这篇文章介绍的是C++从文本文件读取数据到vector中的方法,下面话不多说,直接来看示例代码吧. 如题,要将如下文本文件读进vector中 示例代码如下 #include <iostream> using namespace std; #include <cmath> #include

C++ vector删除符合条件的元素示例分享

C++ vector中实际删除元素使用的是容器vecrot std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的替换. 1.std::vector::erase() 函数原型:iterator erase (iterator position);//删除指定元素 iterator erase (iterator first, iterator last);//删除指定范围内的元素 返回值:指向删除元素(或范围

深入理解C++中的vector类的用法及特性

//<vector> template < class T, class Alloc = allocator<T> > class vector; 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为,向量是一个能够存放任意类型的动态数组. vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为

C++ vector的用法小结

c++ vector用法 C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板. 标准库vector类型使用需要的头文件:#include <vector>.vector 是一个类模板.不是一种数据类型,vector<int>是一种数据类型.Vector的存储空间是连续的,list不是连续存储的. 一. 定义和初始化 vector< typeName > v1

Java中String.split()用法小结

在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1.如果用"."作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split("."); 2.如果用"|"作为分隔的话,必须是如下写法,String.split("\\|"),这样才能正确的分隔开,不能用String.s

mybatis 中 foreach collection的用法小结(三种)

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. item表示集合中每一个元素进行迭代时的别名,     index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,     open表示该语句以什么开始,     separator表示在每次进行迭代之间以什么符号作为分隔 符,     close表示以什么结束. 在使用foreach的时候

JS产生随机数的用法小结

代码如下所述: <script> function GetRandomNum(Min,Max) { var Range = Max - Min; var Rand = Math.random(); return(Min + Math.round(Rand * Range)); } var num = GetRandomNum(1,10); alert(num); </script> var chars = ['0','1','2','3','4','5','6','7','8','

详解PHP中cookie和session的区别及cookie和session用法小结

具体来说 cookie 是保存在"客户端"的,而session是保存在"服务端"的 cookie 是通过扩展http协议实现的 cookie 主要包括 :名字,值,过期时间,路径和域: 如果cookie不设置生命周期,则以浏览器关闭而关闭,这种cookie一般存储在内存而不是硬盘上.若设置了生命周期则相反,不随浏览器的关闭而消失,这些cookie仍然有效直到超过设定的过 期 时间. session 一种类似散列表的形式保存信息, 当程序需要为某个客户端的请求创建一个

MySql数据库中Select用法小结

一.条件筛选 1.数字筛选:sql = "Select * from [sheet1$] Where 销售单价 > 100" 2.字符条件:sql = "Select * from [sheet1$] Where 物品名称 ='挡泥板'" 3.日期条件:sql = "Select * from [sheet1$] Where 物品名称 ='挡泥板'" 4.区间条件:sql = "Select * from [sheet1$] Wh

C++中stack、queue、vector的用法详解

一.栈(stack) 引入头文件 #include<stack> 常用的方法 empty() 堆栈为空则返回真 pop() 移除栈顶元素 push() 在栈顶增加元素 size() 返回栈中元素数目 top() 返回栈顶元素 3.实例代码 #include<iostream> #include<stack> using namespace std; int main(){ //创建栈 s stack<int> s; //将元素压入栈 for(int i=0;

javaScript产生随机数的用法小结

var chars = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']; function generateMixed(n) { var res = ""; for(var i = 0; i < n ; i ++) { var id = M

C/C++ 中const关键字的用法小结

C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性. Const作用 NO. 作用 说明 参考 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误 void f(const int i) { ---} //对传入的参数进行类型检查,不匹配进行提示 3 可以保护被修