std::vector<bool>中的坑

http://www.cplusplus.com/reference/vector/vector/?kw=vector

C++中,vector<bool>为了达到节省内存的目的,专门做了特化,大概方式就是用bit位来存储数组中的元素。代价就是,这个容器里面的内置类型乱掉了:

member type	definition	notes
value_type	The first template parameter (bool)
allocator_type	The second template parameter (Alloc)	defaults to: allocator<bool>
reference	A specific member class (see reference below)
const_reference	bool
pointer	a type that simulates pointer behavior	convertible to const_pointer
const_pointer	a type that simulates pointer to const behavior
iterator	a type that simulates random access iterator behavior	convertible to const_iterator
const_iterator	a type that simulates random access iterator to const behavior
reverse_iterator	reverse_iterator<iterator>
const_reverse_iterator	reverse_iterator<const_iterator>
difference_type	a signed integral type	usually the same as ptrdiff_t
size_type	an unsigned integral type	usually the same as size_t

比较常见的问题是,reference 类型的问题(注意这里const_reference的类型是bool,跟reference不一样,简直奇葩)

vector<bool> a;

a[0];//类型并不是bool!!!

由于定义了operator bool(),一般会有隐式类型转换,所以不易察觉。

但是在某些情况下,比如模板,auto自动类型推导里面,得到的类型是严格的类型,不会做转换,这时候就有可能出问题,比如下面这段代码:

auto b = a[0];

for(const auto& c : a)

{

}

时间: 2024-10-16 12:41:15

std::vector<bool>中的坑的相关文章

避免使用vector&lt;bool&gt;

 作为一个STL容器,vector<bool>只有两点不对.首先,它不是一个STL容器.其次,它并不存储bool.除此之外,一切正常. 一个对象要成为容器,就必须满足C++标准中列出的所有条件,其中一个条件是,如果c是包含对象T的容器,而且c支持operator[],那么下面的代码必须能够被编译: T *p = &c[0]; 换句话说,如果用operator[]取得了container<T>中的一个T对象,那么就可以通过取它的地址得到一个指向该对象的指针.所以,如果ve

C++ 中的std::vector介绍(转)

vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. 为了可以使用vector,必须在你的头文件中包含下面的代码: #include <vector> vector属于std命名域的,因此需要通过命名限定,如下完成你的代码: using std::vector; vector<int

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法

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++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----------------------------------------------vcBuf.resize(stBuf.size());vcBuf.assign(stBuf.begin(), stBuf.end()); vector 转 string  stBuf.clear();stBuf.assign(v

C++ 练习记录2---Effective STL中的vector&lt;bool&gt;

//vs2013 32位win8 cout << sizeof(bool) << endl;//1    deque<bool> d(1);     cout << sizeof(d[0]) << endl;//1 vector<bool> v(1);     cout << sizeof(v[0]) << endl;//16            cout << sizeof(d) <<

实战c++中的string系列--std:vector&lt;char&gt; 和std:string相互转换(vector to stringstream)

有时候也会遇到std:vector与转std:string 相互转换的情况. 首先看一下vector<char>如何转string: std::vector<char> *data = response->getResponseData(); std::string res; //方法一 for (int i = 0;i<data->size();++i) { res+=(*data)[i]; } res+='\0'; std:cout << res;

std::vector中assign resize reserve的区别

1.assign 用于初始化 2.resize 改变capacity,与size 3.reserve 改变capacity,不改变size 超过size的capacity不可直接访问,可通过push_back追加,若size < capacity, push_back操作不尽心内存分配. 测试代码: #include <stdio.h> #include <iostream> #include <vector> #include <string> vo

opencv 容器的使用vector&lt;std::vector&lt;cv::Point&gt;&gt; or 轮廓存储到容器中

vector> allcontourpoint://二层容器 std::vector Pointpoly; //一层容器 allcontourpoint.pop_back(); //弹出上一个, allcontourpoint.push_back(Pointpoly); //存储一个 vector>contours://轮廓 allcontourpoint.push_back(contours[i]); //存储一个 //i ,存储哪一个轮廓 原文地址:https://www.cnblogs.

std::vector介绍

vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. 为了可以使用vector,必须在你的头文件中包含下面的代码: #include <vector> vector属于std命名域的,因此需要通过命名限定,如下完成你的代码: using std::vector; vector<int