当前位置: 首页 > 编程日记 > 正文

C++中vector的使用

向量std::vector是一种对象实体,能够容纳许多各种类型相同的元素,包括用户自定义的类,因此又被称为序列容器。与string相同,vector同属于STL(Standard Template Library)中的一种自定义的数据类型,可以广义上认为是数组的增强版,相当于一个动态数组。

在使用它时,需要包含头文件vector: #include <vector>

vector是一个类模板,不是一种数据类型:

template<class T, class Alloc = allocator<T> > class vector;
vector可以存放任何类型的对象(但必须是同一类对象)。vector对象可以在运行时高效地添加元素。vector中元素是连续存储的,所以除了能够通过迭代器访问外,还可以通过常规的指针偏移量访问元素。换句话说,可以将指向vector元素的指针传入以指向数组元素的指针作为参数的函数。

vector会在需要时自动调整所占内存的大小。与对应的静态数组相比,vector 所占的内存通常要更多,因为它还分配了额外的内存以应对将来可能的扩张。于是,vector 就不必在每次插入元素时都重新分配一次内存了,除非这块预留的内存用尽。已分配内存的总大小可以通过 capacity() 函数查询。所占的额外的内存可以通过调用 shrink_to_fit()(c++11) 返还给系统。

从性能方面考虑,内存重分配操作的代价通常很大。如果事先知道元素个数,可以使用 reserve() 函数消除重新分配操作。

vector值初始化:

(1)、如果没有指定元素初始化,标准库自行提供一个初始化值进行初始化;

(2)、如果保存的是含有构造函数的类类型的元素,标准库使用该类型的构造函数初始化;

(3)、如果保存的是没有构造函数的类类型的元素,标准库产生一个带初始值的对象,使用这个对象进行值初始化。

vector容器内存放的所有对象都是经过初始化的。如果没有指定存储对象的初始值,那么对于内置类型将用0初始化,对于类类型将调用其默认构造函数进行初始化(如果有其它构造函数而没有默认构造函数,那么此时必须提供元素初始值才能放入容器中)。

一个容器就是一些特定类型对象的集合。顺序容器(sequential container)为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。

标准库中的顺序容器包括:

(1)、vector:可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。

(2)、deque:双端队列。支持快速随机访问。在头尾位置插入/删除速度很快。

(3)、list:双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快。

(4)、forward_list:单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作速度都很快。

(5)、array:固定大小数组。支持快速随机访问。不能添加或删除元素。

(6)、string:与vector相似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度快。

除了固定大小的array外,其它容器都提供高效、灵活的内存管理。我们可以添加和删除元素,扩张和收缩容器的大小。容器保存元素的策略对容器操作的效率有着固定的,有时是重大的影响。在某些情况下,存储策略还会影响特定容器是否支持特定操作。

例如,string和vector将元素保存在连续的内存空间中。由于元素是连续存储的,由元素的下标来计算其地址是非常快速的。但是,在这两种容器的中间位置添加或删除元素就会非常耗时:在一次插入或删除操作后,需要移动插入/删除位置之后的所有元素,来保持连续存储。而且,添加一个元素有时可能还需要分配额外的存储空间。在这种情况下,每个元素都必须移动到新的存储空间中。

list和forward_list两个容器的设计目的是令容器任何位置的添加和删除操作都很快速。作为代价,这两个容器不支持元素的随机访问:为了访问一个元素,我们只能遍历整个容器。而且,与vector、deque和array相比,这两个容器的额外内存开销也很大。

deque是一个更为复杂的数据结构。与string和vector类似,deque支持快速的随机访问。与string和vector一样,在deque的中间位置添加或删除元素的代价(可能)很高。但是,在deque的两端添加或删除元素都是很快的,与list或forward_list添加删除元素的速度相当。

forward_list和array是新C++标准增加的类型。与内置数组相比,array是一个种更安全、更容易使用的数组类型。与内置数组类似,array对象的大小是固定的。因此,array不支持添加和删除元素以及改变容器大小的操作。forward_list的设计目标是达到与最好的手写的单向链表数据结构相当的性能。因此,forward_list没有size操作,因为保存或计算其大小就会比手写链表多出额外的开销。对其他容器而言,size保证是一个快速的常量时间的操作。

通常,使用vector是最好的选择,除法你有很好的理由选择其他容器。

以下是一些选择容器的基本原则:

(1)、除法你有很好的理由选择其他容器,否则应该使用vector;

(2)、如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用list或forward_list;

(3)、如果程序要求随机访问元素,应使用vector或deque;

(4)、如果程序要求在容器的中间插入或删除元素,应使用list或forward_list;

(5)、如果程序需要在头尾位置插入或删除元素,但不会在中间位置进行插入或删除操作,则使用deque;

(6)、如果程序只有在读取输入时才需要在容器中间位置插入元素,随后需要随机访问元素,则:首先,确定是否真的需要在容器中间位置添加元素。当处理输入数据时,通常可以很容器地向vector追加数据,然后再调用标准库的sort函数来重排容器中的元素,从而避免在中间位置添加元素。如果必须在中间位置插入元素,考虑在输入阶段使用list,一旦输入完成,将list中的内容拷贝到一个vector中。

如果你不确定应该使用哪种容器,那么可以在程序中只使用vector和list公共的操作:使用迭代器,不使用下标操作,避免随机访问。这样,在必要时选择使用vector或list都很方便。

一般来说,每个容器都定义在一个头文件中,文件名与类型名相同。即,deque定义在头文件deque中,list定义在头文件list中,以此类推。容器均定义为模板类。

顺序容器几乎可以保存任意类型的元素。特别是,我们可以定义一个容器,其元素的类型是另一个容器。这种容器的定义与任何其他容器类型完全一样:在尖括号中指定元素类型(此种情况下,是另一种容器类型)。

下面是测试代码vector.cpp:

#include <vector>
#include <iostream>
#include <assert.h>#include "vector.hpp"int test_vector_init()
{std::vector<int> a; // 声明一个int型向量a,size为0std::vector<int> b(10); // 声明一个初始size为10的向量std::vector<int> c(10, 1); // 声明一个初始size为10且初始值都为1的向量std::vector<int> d(b); // 声明并用向量b初始化向量dstd::vector<int> e(c.begin(), c.begin() + 3); // 将c向量中从第0个到第2个(共3个)作为向量e的初始值,size为3int n[] = { 1, 2, 3, 4, 5 };std::vector<int> f(n, n + 5); // 将数组n的前5个元素作为向量f的初值,size为5std::vector<int> g(&n[1], &n[4]); // 将n[1] - n[4]范围内的元素作为向量g的初值,size为3std::vector<std::string> v(5, "hello");std::vector<std::string> v2(v.begin(), v.end());assert(v == v2);assert(v.begin() + v.size() == v.end());assert(v.end() - v.size() == v.begin());std::vector<int> array{ 9, 7, 5, 3, 1 };std::cout << "array size: "<< array.size() << std::endl; // 5return 0;
}int test_vector_access()
{int n[10];for (int i = 0; i < 10; i++) {n[i] = i;}std::vector<int> a(n, n + 10);// 对其中部分元素进行输入std::cin >> a[2];std::cin >> a[5];std::cin >> a[6];// 输出for (int i = 0; i < a.size(); i++) {std::cout << a[i] << " ";}std::cout << std::endl;// 使用遍历器(又称迭代器)进行输出// vector类的迭代器除了支持通用的前缀自增运算符外,还支持算术运算:it + n、it - n、it2 - it1std::vector<int>::iterator t;for (t = a.begin(); t != a.end(); t++) {std::cout << *t << " ";}std::cout << std::endl;for (std::vector<int>::const_iterator p = a.begin(); p != a.end(); p++) {std::cout << *p << " ";}std::cout << std::endl;size_t i = 0;int* x = a.data(); //返回指向内存中数组第一个元素的指针*x = -111;std::cout << "a[0]: " << a[0] << std::endl; // -111return 0;
}int test_vector_operation()
{int n[10], m[15];for (int i = 0; i < 10; i++) {n[i] = i;m[i] = i + 20;}std::vector<int> a(n, n + 10);std::vector<int> b(m, m + 15);std::vector<int> x;x = a; // 赋值std::cout << "x size: "<<a.size() << std::endl; // 获取向量中的元素个数, 10std::cout << "x capacity: " << x.capacity() << std::endl; // 返回当前存储空间能够容纳的元素数,容器x能够存储的元素个数,10 (x.capacity() >= x.size())std::cout << "x max size: " << x.max_size() << std::endl; // 容器x能容纳的最大元素个数, 4611686018427387903x.reserve(15); // 预留存储空间,确保x.capacity() >= 15std::cout << "x capacity after reserve: " << x.capacity() << std::endl; // 15x.shrink_to_fit();x.resize(5); // 改变容器中可存储元素的个数,确保返回后,有x.size() == 5, 如果之前x.size() < 5, 那么用默认值补全std::cout << "x size after resize: " << x.size() << std::endl; // 5std::vector<int>::reference ref1 = b.front(); // 返回容器中第一个元素的引用(容器必须非空), 20std::vector<int>::reference ref2 = x.back(); // 返回容器中最后一个元素的引用(容器必须非空), 4int value = b[5]; // 返回下标为5的元素的引用(下标从0开始,如果下标不正确,则属于未定义行为), 25std::vector<int>::reference ref3 = b.at(5); // 返回下标为pos的元素的引用;如果下标不正确,则抛出异常, 25x.push_back(-100); // 将元素添加到容器末尾,向容器末尾添加一个元素value = x[x.size() - 1]; // -100std::cout << "x size after push_back: " << x.size() << std::endl; // 6x.pop_back(); // 删除最后一个元素, 弹出容器中最后一个元素(容器必须非空)value = x[x.size() - 1]; // 4std::cout << "x size after pop_back: " << x.size() << std::endl; // 5x.assign(10, -1); // 赋值,用指定元素序列替换容器内所有元素std::cout << "x size after assign: " << x.size() << std::endl; // 10std::cout << "x[0]: " << x[0] << std::endl; // -1std::cout << "a is empty: "<< a.empty() << std::endl; // 判断向量是否为空, 0std::cout << "a size: " << a.size() << std::endl; // 获取向量中的元素个数, 10a.clear(); // 删除全部内容, 清空向量中的元素,相当于调用erase(begin(), end())std::cout << "size after clear: " << a.size() << std::endl; // 0std::vector<int> c;c = b; // 将b向量复制到c向量中std::cout << "a == b ?: " << (a == b) << std::endl; // == 、 != 、>、 >= 、<、 <= , 采用字典排序策略比较,a向量与b向量比较, 相等则返回1, 0std::cout << "c == b ?: " << (c == b) << std::endl; // == 、 != 、>、 >= 、<、 <= , 采用字典排序策略比较,c向量与b向量比较, 相等则返回1, 1// 插入和删除操作将发生元素的移动(为了保持连续存储的性质),所以之前的迭代器可能失效// 任何改变容器大小的操作都可能造成以前的迭代器失效std::cout << "b size: " << b.size() << std::endl; // 15b.insert(b.begin(), -1); // 将-1插入到向量b的起始位置前std::cout << "b[0]: " << b[0] << std::endl; // -1std::cout << "b size: " << b.size() << std::endl; // 16b.insert(b.begin() + 5, 3, -1); //将-1分别插入到向量元素位置的5-8处(共3个元素)for (int i = 0; i < b.size(); i++) {std::cout << b[i] << "  "; // -1 20 21 22 23 -1 -1 -1 24 25 ...}std::cout<<std::endl;std::vector<int> d(5, 1);std::vector<int> e(10);e.insert(e.begin(), d.begin(), d.end()); //将d.begin(), d.end()之间的全部元素插入到e.begin()前for (int i = 0; i < e.size(); i++) {std::cout << e[i] << "  "; // 1 1 1 1 1 0 0 0 ...}std::cout << std::endl;std::cout << "b size: " << b.size() << std::endl; // 19b.erase(b.begin()); // 将起始位置的元素删除std::cout << "b size: " << b.size() << std::endl; // 18b.erase(b.begin(), b.begin() + 3); // 将(b.begin(), b.begin()+3)之间的元素删除std::cout << "b size: " << b.size() << std::endl; // 15b.swap(c); // 交换vector的内容, a向量与c向量进行交换for (int i = 0; i < b.size(); i++) {std::cout << b[i] << "  ";}std::cout << std::endl;for (int i = 0; i < c.size(); i++) {std::cout << c[i] << "  ";}std::cout << std::endl;return 0;
}int test_vector_two_dimension()
{// reference: http://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.htmlstd::vector< std::vector<int> > b(10, std::vector<int>(5, -1));// 对部分数据进行输入std::cin >> b[1][1];std::cin >> b[2][2];std::cin >> b[3][3];// 全部输出for (int m = 0; m < b.size(); m++) { //b.size()获取行向量的大小for (int n = 0; n < b[m].size(); n++) { //获取向量中具体每个向量的大小std::cout << b[m][n] << "  ";}std::cout << std::endl;}return 0;
}
主要参考文献:

1. https://software.intel.com/zh-cn/blogs/2011/08/10/c-vector

2. http://zh.cppreference.com/w/cpp/container/vector

3. http://www.cplusplus.com/reference/vector/vector/


GitHub:https://github.com/fengbingchun/Messy_Test

相关文章:

说出来你可能不信,现在酒厂都在招算法工程师

导语&#xff1a;虽然夏日已过&#xff0c;但人们喝啤酒的热情还在持续高涨。不过随着大众的追求和理念提升&#xff0c;对于啤酒的要求也越来越高&#xff0c;比如逐渐兴起的精酿之风&#xff0c;都在印证人们在啤酒的口感和风味上&#xff0c;拥有更加「苛刻」的要求。那么这…

「前端面试题系列7」Javascript 中的事件机制(从原生到框架)

前言 这是前端面试题系列的第 7 篇&#xff0c;你可能错过了前面的篇章&#xff0c;可以在这里找到&#xff1a; 理解函数的柯里化ES6 中箭头函数的用法this 的原理以及用法伪类与伪元素的区别及实战如何实现一个圣杯布局&#xff1f;今日头条 面试题和思路解析最近&#xff0c…

安装Ecshop首页出现报错:Only variables should be passed by referen

出现下面这就话&#xff1a; Strict Standards: Only variables should be passed by reference in D:\wamp\ecshop\includes\cls_template.php on line 406 第406行&#xff1a;$tag_sel array_shift(explode( , $tag)); 解决办法 1 5.3以上版本的问题&#xff0c;应该也和配…

KDD 2019高维稀疏数据上的深度学习Workshop论文汇总

作者 | 深度传送门来源 | 深度传送门【导读】本文是“深度推荐系统”专栏的第九篇文章&#xff0c;这个系列将介绍在深度学习的强力驱动下&#xff0c;给推荐系统工业界所带来的最前沿的变化。本文简要总结一下阿里妈妈在 KDD 2019 上组织的第一届面向高维稀疏数据的深度学习实…

C++中fstream的使用

C中处理文件类似于处理标准输入和标准输出。类ifstream、ofstream和fstream分别从类 istream、ostream和iostream派生而来。作为派生的类&#xff0c;它们继承了插入和提取运算符&#xff08;以及其他成员函数&#xff09;&#xff0c;还有与文件一起使用的成员和构造函数。可将…

浅谈Disruptor

Disruptor是一个低延迟(low-latency)&#xff0c;高吞吐量(high-throughput)的事件发布订阅框架。通过Disruptor&#xff0c;可以在一个JVM中发布事件&#xff0c;和订阅事件。相对于Java中的阻塞队列(ArrayBlockingQueue,LinkedBlockingQueue)&#xff0c;Disruptor的优点是性…

web 服务发布注意事项

1、在发布的时候首先查看服务器对外开放的端口&#xff0c;如果没有最好和客户进行沟通需要开放那些对应的端口&#xff0c;要不外界无法访问发布的站点。 2、在oracle需要远程控制服务器的数据库的时候需要开发1521端口。转载于:https://www.cnblogs.com/jzm53550629/p/337563…

OpenCV代码提取:resize函数的实现

之前在http://blog.csdn.net/fengbingchun/article/details/17335477 中有过对cv::resize函数五种插值算法的介绍。这里将OpenCV3.1中五种插值算法的代码进行了提取调整。支持N通道uchar和float类型。经测试&#xff0c;与OpenCV3.1结果完全一致。实现代码resize.hpp&#xff1…

IBM重磅开源Power芯片指令集?国产芯迎来新机遇?

整理 | 郭芮出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;自去年 IBM 以 340 亿美元收购了 Linux 巨头红帽之后&#xff0c;这家 107 岁的蓝色巨人终于又在开源方面有大动作了&#xff01;近日在 Linux 基金会开源峰会上&#xff0c;IBM 宣布向开源社区提供 Powe…

构造函数不能为虚/重载函数总结

构造函数不能为虚/重载函数总结 作为一个类&#xff0c;他最基础的成员函数就要数构造函数了。这里我们先探讨一下构造函数为什么不能是虚函数。 在解决这个问题之前&#xff0c;要先明白类中函数的调用方式。一个类的函数共用一个函数空间&#xff0c;因此在实例化的对象中是不…

通过data:image/png;base64把图片直接写在src里

2019独角兽企业重金招聘Python工程师标准>>> 关于用base64存储图片 网页上有些图片的src或css背景图片的url后面跟了一大串字符&#xff0c;比如&#xff1a;data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZS…

算力“竞速”,企业AI落地的当务之急

充足的算力资源&#xff0c;在数据量持续增长及算法持续复杂化的前提下&#xff0c;无疑是保障人工智能应用落地效果的关键。软件定义算力——打造AI转型最佳实践8月2日&#xff0c;第四范式联合英特尔共同举办了AI实践者之声夏令营活动。第四范式基础架构负责人刘一鸣以《软件…

内存检测工具Dr. Memory的使用

Dr. Memory是一个内存调试工具&#xff0c;它是一个开源免费的内存检测工具&#xff0c;它能够及时发现内存相关的编程错误&#xff0c;比如未初始化访问、内存非法访问、数组越界读/写、以及内存泄露等。它可以在Linux、Windows、Mac OS和Android操作系统上使用。关于Dr. Memo…

手把手教你如何新建scrapy爬虫框架的第一个项目(下)

前几天小编带大家学会了如何在Scrapy框架下创建属于自己的第一个爬虫项目&#xff08;上&#xff09;&#xff0c;今天我们进一步深入的了解Scrapy爬虫项目创建&#xff0c;这里以伯乐在线网站的所有文章页为例进行说明。在我们创建好Scrapy爬虫项目之后&#xff0c;会得到上图…

.net完整的图文验证

摘自:http://blog.csdn.net/durongjian/article/details/4336380 一、创建ValidaeCode类库工程&#xff1a; 1、创建ValidaeCode类库工程&#xff0c;在[解决胜方案资源管理器]面板中&#xff0c;右键单击[ValidateCode]节点&#xff0c;并选择[属性]命令。 2、单击[属性]命令&…

Tesseract-OCR 3.04在Windows7 vs2013上编译过程

从https://github.com/tesseract-ocr/tesseract下载最新源码,commit id: 86acff5, 2016.06.07. 里面有个vs2010目录&#xff0c;用vs2013打开tesseract.sln。Tesseract依赖图像库Leptonica&#xff0c;Leptonica的编译过程可以参考http://blog.csdn.net/fengbingchun/article/d…

【Laravel-海贼王系列】第九章, Events 功能解析

Events 注册 框架如何在启动的时候加载注册的事件?框架如何触发事件?1&#xff0c;先在容器中注册 events 的全局对象。 Application 构造函数中对 events 进行注册代码 protected function registerBaseServiceProviders(){$this->register(new EventServiceProvider($th…

触类旁通,经典面试题最长公共子序列应该这么答

作者 | labuladong来源 | labuladong&#xff08;ID:labuladong)【导读】最长公共子序列&#xff08;Longest Common Subsequence&#xff0c;简称 LCS&#xff09;是一道非常经典的面试题目&#xff0c;因为它的解法是典型的二维动态规划&#xff0c;大部分比较困难的字符串问…

两分公支的IPSec***流量走总部测试

一.概述&#xff1a;在论坛上看到一个朋友发帖希望两个分支的IPSEC ***流量经过总部&#xff0c;如是搭建拓扑测试了一下&#xff0c;因为跑两个VM版的ASA8.42机器性能不过&#xff0c;所以用PIX8.0来代替ASA,应该主要配置都跟ASA8.0差不多。二.基本思路&#xff1a;A.两个分支…

OpenCV代码提取:cvtColor函数的实现

OpenCV中的cvtColor函数包括了很多颜色格式之间的转换&#xff0c;用起来很方便&#xff0c;这里对cvtColor函数的code进行了提取&#xff0c;经测试&#xff0c;和OpenCV3.1结果完全一致。实现代码cvtColor.hpp:// fbc_cv is free software and uses the same licence as Open…

关于java.util.LinkedHashMap cannot be cast to ......的解决办法

今天在项目中遇到一个问题&#xff0c;接口接收到list在对list进行遍历的时候报出如下错误: 断点看一下这个list感觉没有任何的问题: 那为什么会报这个错误呢 这个接口是这样的&#xff0c;在想会不会是json在转list的时候把这个list给整坏了。 于是&#xff0c;我把这个list再…

三两下实现NLP训练和预测,这四个框架你要知道

作者 | 狄东林 刘元兴 朱庆福 胡景雯编辑 | 刘元兴&#xff0c;崔一鸣来源 | 哈工大SCIR&#xff08;ID:HIT_SCIR)引言随着人工智能的发展&#xff0c;越来越多深度学习框架如雨后春笋般涌现&#xff0c;例如PyTorch、TensorFlow、Keras、MXNet、Theano 和 PaddlePaddle 等。这…

大学计算机基础实验

下载2013算法实验报告.rar转载于:https://www.cnblogs.com/shajianheng/p/3381968.html

java基础(十三)-----详解内部类——Java高级开发必须懂的

java基础(十三)-----详解内部类——Java高级开发必须懂的 目录 为什么要使用内部类内部类基础静态内部类 成员内部类 成员内部类的对象创建继承成员内部类局部内部类推荐博客匿名内部类正文 可以将一个类的定义放在另一个类的定义内部&#xff0c;这就是内部类。 回到顶部为什么…

C++中函数指针的使用

A function pointer is a variable that stores the address of a function that can later be called through that function pointer. This is useful because functions encapsulate behavior.函数指针是一个指向函数的指针,函数指针表示一个函数的入口地址。指针是变量&…

只做好CTR预估远不够,淘宝融合CTR、GMV、收入等多目标有绝招

作者 | 吴海波转载自知乎用户吴海波【导读】一直以来&#xff0c;电商场景就存在 ctr、cvr、gmv、成交 uv 等多个目标&#xff0c;都是核心指标。理想情况下&#xff0c;提升 ctr 就能提升 gmv&#xff0c;但本文作者认为&#xff0c;在一定程度上&#xff0c; ctr 和 gmv 并不…

Android监听HOME按键

2019独角兽企业重金招聘Python工程师标准>>> <!-- lang: java --> class HomeKeyEventBroadCastReceiver extends BroadcastReceiver {static final String SYSTEM_REASON "reason";static final String SYSTEM_HOME_KEY "homekey";// …

OpenCV代码提取:merge/split函数的实现

对OpenCV中的merge/split函数进行了实现&#xff0c;经测试&#xff0c;与OpenCV3.1结果完全一致。merge实现代码merge.hpp&#xff1a;// fbc_cv is free software and uses the same licence as OpenCV // Email: fengbingchun163.com#ifndef FBC_CV_MERGE_HPP_ #define FBC_…

DeepMind提图像生成的递归神经网络DRAW,158行Python代码复现

作者 | Samuel Noriega译者 | Freesia编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】最近&#xff0c;谷歌 DeepMInd 发表论文( DRAW: A Recurrent Neural Network For Image Generation&#xff09;&#xff0c;提出了一个用于图像生成的递归神…

其他进制的数字

JS中如果需要表示16进制的数字,则需要以0X开头 0X10 八进制数字以0开头 070 070有些浏览器会以8进制解析,但是有些则用10进制解析,10进制为70,8进制为56 所以parseint() 第二个参数可以设定进制,比如 parseint(“070”,10)代表以10进制解析070 2进制以0b开头,但是不是所有浏览…