前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++(STL):11---vector源码剖析

C++(STL):11---vector源码剖析

作者头像
用户3479834
发布于 2021-02-03 06:42:50
发布于 2021-02-03 06:42:50
4.8K00
代码可运行
举报
文章被收录于专栏:游戏开发司机游戏开发司机
运行总次数:0
代码可运行

一、vector概述

  • vector的使用语法可以参考文章之前的几篇文章,总的来说:vector是可变大小数组
  • 特点:
    • 支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢
    • 元素保存在连续的内存空间中,因此通过下标取值非常快
    • 容器中间位置添加或删除元素非常耗时
    • 一旦vector内存不足,重新申请内存之后,和原vector相关的指针,引用,迭代器都失效。内存重分配耗时很长
  • 通常,使用vector是最好的选择,如果没有什么特殊要求,最好使用vector
  • 与其他容器的比较:

vector

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

deque

双端队列。支持快速随机访问。在头尾插入/删除速度很快

list

双向链表。只支持双向顺序访问。在list中任何位置进行插入和删除的速度都很快

forward_list

单向链表。只支持单向顺序访问。在链表任何位置进行插入和删除操作速度都很快

array

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

string

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

二、vector定义摘要

  • vector定于与<stl_vector.h>头文件中
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//alloc是SGI STL的空间配置器
template <class T, class Alloc = alloc>
class vector {
public:
// vector 的嵌套类型定义
typedef T value_type;
typedef value_type* pointer;
typedef value_type* iterator;
typedef value_type& reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;


protected:
// simple_alloc是SGI STL的空间配置器,见前面空间适配器文章的介绍
typedef simple_alloc<value_type, Alloc> data_allocator;
iterator start; // 表示目前使用空间的头
iterator finish; // 表示目前使用空间的尾
iterator end_of_storage; // 表示目前可用空间的尾


void insert_aux(iterator position, const T& x);
void deallocate() {
if (start)
data_allocator::deallocate(start, end_of_storage - start);
}


void fill_initialize(size_type n, const T& value) {
start = allocate_and_fill(n, value);
finish = start + n;
end_of_storage = finish;
}


public:
iterator begin() { return start; }
iterator end() { return finish; }
size_type size() const { return size_type(end() - begin()); }
size_type capacity() const {
return size_type(end_of_storage - begin());
}
bool empty() const { return begin() == end(); }
reference operator[](size_type n) { return *(begin() + n); }


vector() : start(0), finish(0), end_of_storage(0) {}
vector(size_type n, const T& value) { fill_initialize(n,value); }
vector(int n, const T& value) { fill_initialize(n,value); }
vector(long n, const T&value) { fill_initialize(n,value); }
explicit vector(size_type n) { fill_initialize(n,T()); }


~vector()
destroy(start, finish); //全局函式,见前面文章destroy函数的介绍
deallocate(); //这是 vector的㆒个 member function
}


reference front() { return *begin(); } // 第一个元素
reference back() { return *(end() - 1); } // 最后一个元素
void push_back(const T& x) { // 将元素安插至最尾端
if (finish != end_of_storage) {
construct(finish, x); //全局函式,见前面文章construct函数的介绍
++finish;
}
else
insert_aux(end(), x); //这是 vector的一个member function
}


void pop_back() { // 将最尾端元素取出
--finish;
destroy(finish); // 全局函式,见前面文章destroy函数的介绍
}


iterator erase(iterator position) { // 清除某位置上的元素
if (position + 1 != end())
copy(position + 1, finish, position); // 后续元素往前搬移
--finish;
destroy(finish); // 全局函式,见前面文章destroy函数的介绍
return position;
}


void resize(size_type new_size, const T& x) {
if (new_size < size())
erase(begin() + new_size, end());
else
insert(end(), new_size - size(), x);
}
void resize(size_type new_size) { resize(new_size, T()); }
void clear() { erase(begin(), end()); }


protected:
// 配置空间并填满内容
iterator allocate_and_fill(size_type n, const T& x) {
iterator result = data_allocator::allocate(n);
uninitialized_fill_n(result, n, x); // 全局函式,见前面uninitialized_fill_n函数的介绍
return result;
}

三、vector的迭代器

  • vector维护的是一个连续线性空间,所以不论其元素类别是什么,普通指针都可以作为vector的迭代器而满足所有必要条件
  • vector迭代器支持有操作有(普通指针也具备):
    • operator*、operator->、operator++、operator--、operator+、operator-、operator+=、operator-=
  • vector支持随机存取,而普通指针正有着这样的能力,所以,vector提供的是随机访问迭代器(Random Access iterators)
  • vector的迭代器定义如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class T, class Alloc = alloc>
class vector {
public:
typedef T value_type;
typedef value_type* iterator; //vector的迭代器是原生指标
...
};
  • 例如:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector<int>::iterator ivite;   //等同于int* ivite;
vector<Shape>::iterator svite; //等同于Shape* svite;

四、vector的数据结构

  • vector的数据结构非常简单:一个线性连续空间
  • 下面介绍vector的3个数据结构:
    • start:表示目前使用空间的头
    • finish:表示目前使用空间的尾
    • end_of_storage:表示目前可用空间的尾
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class T, class Alloc = alloc>
class vector {
...
protected:
iterator start; //表示目前使用空间的头
iterator finish; //表示目前使用空间的尾
iterator end_of_storage; //表示目前可用空间的尾
...
};
  • 说明:为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端需求量更大一些,以备将来可能的扩充。这便是容量的概念。也就是说,一个vector的容量永远大于或等于其大小。一旦容量等于大小,下次再新增元素时就需要新开辟一块空间。如下图所示
  • 运用start、finish、end_of_storage三个迭代器,vector提供了首尾标示、大小、容量、空容器判断、注标[]运算符、最前端元素值、最后端元素值....等机能,如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class T, class Alloc = alloc>
class vector {
...
public:
iterator begin() { return start; }
iterator end() { return finish; }
size_type size() const { return size_type(end() - begin()); }
size_type capacity() const {
return size_type(end_of_storage - begin());
}
bool empty() const { return begin() == end(); }
reference operator[](size_type n) { return *(begin() + n); }
reference front() { return *begin(); }
reference back() { return *(end() - 1); }
...
};

五、vector的构造与内存管理(constructor、push_back)

vector的内存管理

  • vector默认使用alloc做为空间配置器,并据此另外定义了一个data_allocator,为的是更方便以元素大小为配置单位:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class T, class Alloc = alloc>
class vector {
protected:
// simple_alloc<>见前面文章介绍
typedef simple_alloc<value_type, Alloc> data_allocator;
...
};
  • 于是,data_allocator::allocate(n) 表示配置n个元素空间

构造函数

  • vector提供许多构造函数,其中一个允许我们指定空间大小及初值:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//构造函数,允许指定vector大小n和初值value
vector(size_type n, const T& value) { fill_initialize(n, value); }


// 充填并予初始化
void fill_initialize(size_type n, const T& value) {
start = allocate_and_fill(n, value);
finish = start + n;
end_of_storage = finish;
}


// 配置而后充填
iterator allocate_and_fill(size_type n, const T& x) {
iterator result = data_allocator::allocate(n); //配置n个元素空间
uninitialized_fill_n(result, n, x); //全局函式,会根据第1个参数类型特性决定使用算法fill_n()或反复调用construct()来完成任务
return result;
}

push_back()函数

  • 当我们以push_back() 将新元素安插入于vector尾端时,该函式首先检查是否还有备用空间,如果有就直接在备用空间上建构元素,并调整迭代器finish,使vector变大。如果没有备用空间了,就扩充空间(重新配置、搬移数据、释放原空间)
  • push_back()原型如下:
代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void push_back(const T& x) {
if (finish != end_of_storage) { //还有备用空间
construct(finish, x); //全局函式
++finish; //调整水位高度
}
else //已无备用空间
insert_aux(end(), x); // vector member function,见下
}
template <class T, class Alloc>
void vector<T, Alloc>::insert_aux(iterator position, const T& x) {
if (finish != end_of_storage) { //还有备用空间
// 在备用空间起始处建构一个元素,并以 vector 最后一个元素值为其初值。
construct(finish, *(finish - 1));
// 调整水位。
++finish;
T x_copy = x;
copy_backward(position, finish - 2, finish - 1);
*position = x_copy;
}
else { // 已无备用空间
const size_type old_size = size();
const size_type len = old_size != 0 ? 2 * old_size : 1;
// 以上配置原则:如果原大小为0,则配置 1(个元素大小)
// 如果原大小不为 0,则配置原大小的两倍,
// 前半段用来放置原数据,后半段准备用来放置新数据
iterator new_start = data_allocator::allocate(len); // 实际配置
iterator new_finish = new_start;
try {
// 将原 vector 的内容拷贝到新vector
new_finish = uninitialized_copy(start, position, new_start);
// 为新元素设定初值 x
construct(new_finish, x);
// 调整水位
++new_finish;
// 将原vector的备用空间中的内容也忠实拷贝过来
new_finish = uninitialized_copy(position, finish, new_finish);
}
catch(...) {
// "commit or rollback" semantics.
destroy(new_start, new_finish);
data_allocator::deallocate(new_start, len);
throw;
}
//析构并释放原vector
destroy(begin(), end());
deallocate();


// 调整迭代器,指向新vector
vector start = new_start;
finish = new_finish;
end_of_storage = new_start + len;
}
}
代码语言:javascript
代码运行次数:0
运行
复制

六、vector内存重分配策略

  • vector的内存重分配策略:
    • vector是以数组的形式存储的,当往vector中增加元素时,如果vector的容量不足,那么vector就会进行扩容
    • 扩容的规则是:并不是在原空间之后接续新空间(因为无法保证原空间之后尚有可供配置的空间),而是申请一块比现在大的新的内存空间(gcc和vc申请规则不同,见下面介绍),然后原来内存中的内容拷贝到新内存中,然后释放原来的内存
    • 重点:在gcc和vc的环境下,vector的扩容规则是不一样的
  • 注意(重点): 对vector 的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。这是程序员易犯的一个错误,务需小心

Windows下

  • vector内存重分配即容量的增长是有规律的,可以通过下面的公式描述:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
maxSize = maxSize + ((maxSize >> 1) > 1 ? (maxSize >> 1) : 1)
  • 图解:
    • 就是由1、2、3、4、6、9、13、19......依次增长
    • 从4之后开始有规则:当前索引处的值等于前一个元素值和前前前元素的值之和
  • 测试程序如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <vector>


using namespace std;


int main()
{
std::vector<int> iv;
iv.push_back(1);


cout << iv.capacity() << endl; //1


iv.push_back(1);
cout << iv.capacity() << endl; //2


iv.push_back(1);
cout << iv.capacity() << endl; //3


iv.push_back(1);
cout << iv.capacity() << endl; //4


iv.push_back(1);
cout << iv.capacity() << endl; //6


iv.push_back(1);


iv.push_back(1);
cout << iv.capacity() << endl; //9


return 0;
}
  • 运行效果如下:

Linux下

  • Linux下的扩容规则是:其比较简单,就是将大小扩充为原来的2倍
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
maxSize = maxSize*2;
  • 图解:就是由1、2、4、8、16......依次增长
  • 测试程序如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <vector>


using namespace std;


int main()
{
std::vector<int> iv;
iv.push_back(1);


cout << iv.capacity() << endl; //1


iv.push_back(1);
cout << iv.capacity() << endl; //2


iv.push_back(1);
cout << iv.capacity() << endl; //4


iv.push_back(1);
cout << iv.capacity() << endl; //4


iv.push_back(1);
cout << iv.capacity() << endl; //8


iv.push_back(1);


iv.push_back(1);
cout << iv.capacity() << endl; //8


return 0;
}
  • 运行效果如下:

七、vector的元素操作(pop_back、erase、clear、insert)

  • 所提供的元素操作动作很多,不就在此文章中一一说明

pop_back

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//将尾端元素拿掉,并调整大小
void pop_back() {
--finish; //将尾端标记往前移一格,表示将放弃尾端元素
destroy(finish); // destroy是全局函式
}

erase

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 清除[first,last)中的所有元素
iterator erase(iterator first, iterator last) {
iterator i = copy(last, finish, first); //copy是全局函式
destroy(i, finish); //destroy是全局函式
finish = finish - (last - first);
return first;
}
  • 下图是上面这个erase函数的版本
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 清除某个位置上的元素
iterator erase(iterator position) {
if (position + 1 != end())
copy(position + 1, finish, position); //copy是全局函式
--finish;
destroy(finish); //destroy是全局函式
return position;
}

clear

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//清除容器内所有元素
void clear() { erase(begin(), end()); }

insert

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//从position开始,插入n个元素,元素初值为x
template<class T,class Alloc>
void vector<T, Alloc>::insert(iterator position, size_type n, const T& x)
{
if (n != 0) { //当n!= 0才进行以下所有动作
if (size_type(end_of_storage - finish) >= n){
//备用空间大于等于“新增元素个数”
T x_copy = x;
// 以下计算插入点之后的现有元素个数
const size_type elems_after = finish - position;
iterator old_finish = finish;
if (elems_after > n){
//“插入点之后的现有元素个数”大于“新增元素个数”
uninitialized_copy(finish - n, finish, finish);
finish += n; // 将vector尾端标记后移
copy_backward(position, old_finish - n, old_finish);
fill(position, position + n, x_copy); //从插入点开始填入新值
}
}
else {
//“插入点之后的现有元素个数”小于等于“新增元素个数”
uninitialized_fill_n(finish, n - elems_after, x_copy);
finish += n - elems_after;
uninitialized_copy(position, old_finish, finish);
finish += elems_after;
fill(position, old_finish, x_copy);
}
}
else {
// 备用空间小于“新增元素个数”(那就必须配置额外的内存)
// 首先决定新长度:旧长度的两倍,或旧长度+新增元素个数
const size_type old_size = size();
const size_type len = old_size + max(old_size, n);
// 以下配置新的vector空间
iterator new_start = data_allocator::allocate(len);
iterator new_finish = new_start;


STL_TRY {
// 以下首先将旧vector的安插点之前的元素复制到新空间
new_finish = uninitialized_copy(start, position, new_start);
// 以下再将新增元素(初值皆为n)填入新空间
new_finish = uninitialized_fill_n(new_finish, n, x);
// 以下再将旧 vector 的插入点之后的元素复制到新空间
new_finish = uninitialized_copy(position, finish, new_finish);
}
# ifdef STL_USE_EXCEPTIONS
catch(...) {
// 如有异常发生,实现"commit or rollback" semantics.
destroy(new_start, new_finish);
data_allocator::deallocate(new_start, len);
throw;
}
# endif /* STL_USE_EXCEPTIONS */


// 以下清除并释放旧的vector
destroy(start, finish);
deallocate();
// 以下调整水位标记
start = new_start; finish =
new_finish; end_of_storage =
new_start + len;
}
}
  • 注意,插入完成后,新节点将位于哨兵迭代器(即上缪按的position,标示出插入点) 所指之节点的前方——这是STL对于“插入操作”的标准规范。下面的图片展示了insert(position,n,x)的操作

备用空间>=新增元素个数的情况:

  • ①备用空间2>=新增元素个数2
  • ②插入点之后的现有元素个数3>新增元素个数2
  • ③插入点之后的现有元素个数2<=新增元素个数3

备用空间>=新增元素个数的情况:

  • 例如下面备用空间2<新增元素个数n==3
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 游戏开发司机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
仓储自动化与机器人协同:难点、技术解决方案及案例分析
随着电商行业的迅猛发展和物流需求的不断增长,仓储自动化与机器人协同作业成为提升仓储效率和降低成本的关键。然而,在实际应用中,面临着高密度存储与快速分拣的矛盾、多机协作冲突以及异常处理等诸多难点。本文深入探讨了这些难点的本质和成因,并详细介绍了如 SLAM、多智能体系统(MAS)、数字孪生监控等技术解决方案。同时,以京东“亚洲一号”仓库为例,分析了仓储自动化与机器人协同的实际应用效果。通过大量的数据和图表,全面展示了仓储自动化与机器人协同的发展现状和未来趋势,为相关企业和研究人员提供了有价值的参考。
jack.yang
2025/04/05
4220
“机器人即服务”(RAAS)模式的仓储机器人是什么样子的?
仓库管理是一个正在以惊人的速度实现自动化的主要行业之一——使用仓储机器人来完成一些任务,如在仓库周围提取物品、分类和置物架、挑选和包装,以及最终发货。
GPUS Lady
2020/01/13
2.8K0
“机器人即服务”(RAAS)模式的仓储机器人是什么样子的?
京东菜鸟竞相用AI武装仓库,中国已进入智能物流时代?
近日,京东和菜鸟接连在智能物流领域出手,全球首个正式落成并运营的全程无人分拣中心和号称中国最大的机器人仓库分别在昆山和广东惠阳开始运营,这标志着智能物流正走过概念化阶段,变得更为务实。 京东全程无人
机器人网
2018/04/24
1.2K0
京东菜鸟竞相用AI武装仓库,中国已进入智能物流时代?
基于移动机器人的拣货系统研究进展
来源:专知本文约900字,建议阅读5分钟本文为你介绍基于移动机器人的拣货系统。 基于移动机器人的拣货系统(Robotic mobile fulfillment systems, RMFS)作为一种新型物至人的拣货系统, 相比人工拣货系统和AS/RS拣货系统(下文统称传统拣货系统)具有更高的拣货效率、更好的系统可扩展性和柔性. 为全面了解RMFS的运行模式及其优化方向, 本文首先回顾了RMFS的工作流程及优化理论框架, 然后对RMFS的货位指派、订单分批、任务分配、路径规划以及建模方法等问题进行了文献回顾和
数据派THU
2022/03/04
3160
真机智能刘智勇:无人配送是一个必然走向,机器人将成为新的“快递员” | 镁客请讲
真机智能新一轮融资即将在春节后立马开启。 “无人配送是物流行业发展的必然走向。” 真机智能创始人&CEO刘智勇说。 图 | 真机智能创始人&CEO刘智勇 能解决问题的事情就是大事情 劳动力迁移就是真机智能的大事情 刘智勇曾就读于爱因斯坦的母校——苏黎世联邦理工学院计算机系攻读博士学位,主要研究方向为人工智能和机器人技术。作为最佳论文奖获得者,刘智勇真正的梦想一直是创立一家技术公司,让科技得以真正地落地,所以他选择了休学。 “我没有冒然地去创
镁客网
2018/05/29
1K0
全球三大雇主已部署了数万机器人
你不用担心将来机器人是否会取代你的工作,这已经开始发生了。 全球十大雇主中的三家已经部署了数万机器人,代替工人的劳动: 苹果、谷歌和亚马逊的主要合作代工制造商富士康是全球第十大雇主。这家公司已经用机器人取代了6万名工人。 目前雇用210万员工的全球第三大雇主沃尔玛计划用无人机取代仓库拣货员。沃尔玛正在研发的无人机可以给仓库中商品扫码,然后将数据发送到控制中心。使用这种方法,拣货和盘点库存的速度将会提高数十倍。沃尔玛计划在美国所有190个配送中心部署这种无人机,而仓库拣货员将被安排到新的工作岗位。 全
机器人网
2018/04/13
5140
全球三大雇主已部署了数万机器人
双十一买买买,机器人帮你发货
---- 电商正全力以赴迎接“双十一”订单高峰的考验。昨天下午,记者在阿里巴巴下属的菜鸟网络天津仓看到,仓库使用谷歌眼镜、自动行驶机器人等智能设备,以提高 拣货速度。记者在现场看到,自动行驶机器人大
机器人网
2018/04/13
6090
双十一买买买,机器人帮你发货
沃尔玛收购Alert Innovation,三维移动机器人亮相
大数据文摘授权转载自机器人大讲堂 近日,全球最大的零售商沃尔玛宣布成功收购Alert Innovation。 这笔交易一度让我们难以理解,在机器人自动化提供商如此多的情况下,为什么沃尔玛依然选择收购这样一家机器人企业? 在许多报道中,对沃尔玛的收购原因也语焉不详。机器人大讲堂详细了解Alert Innovation这家企业后,发现这笔收购背后并不简单。 与国内的移动机器人还在地上跑不同,Alert Innovation的机器人已经能够在立库货架上爬上爬下,同时Alert Innovation还是一个仓库软
大数据文摘
2023/04/10
1780
沃尔玛收购Alert Innovation,三维移动机器人亮相
美团开店首秀:全自动拣货,95%订单全无人配送
机器之心原创 作者:力琴 敢为人先的美团,也开始学起亚马逊开店了,不过这是第一家由骑手经营的智慧门店。以无人微仓和无人配送发展「前置仓 + 即时配送」的新型零售门店,首次落地首钢园,为 3km 半径内智慧园区的生活服务提供新的机会。 十一期间,美团在即将开展冬奥会的首钢园开了第一家 AI 智慧门店——MAI shop。 智慧门店并非新鲜事,早在两年前,亚马逊以「无需排队、拿完就走」理念的无人商店 Amazon Go 叩开了新型无人零售店的大门。 美团的 MAI shop 采用门店仓配一体化的模式,采用无人
机器之心
2023/03/29
5680
美团开店首秀:全自动拣货,95%订单全无人配送
震惊!亚马逊竟然做出这种事,让快递员可以随便进入你的家!
(亚马逊Amazon Key示意视频) 上面这段视频中所呈现的场景是不是在“神奇”的时候又有一点“惊悚”?以上发生的情景可不是亚马逊的“臆想”,而是他们将在下个月正式推出的一个服务——Amazon K
镁客网
2018/05/30
4970
快递小哥要失业了!盘点九款给力的送货机器人
说起快递的速度,中国可谓是无出其右,因为强大的人力资源以及完善的供应链结构,导致整个运作过程很流畅快速。但是,如果在特殊的节点,比如双十一,快递也无能为力了。然而如果我们能让机器人来帮忙的话,应该能分担一些物流工作,提高订单处理效率。比如亚马逊2012年就已开始采用机器人Kiva开展仓储物流业务,现在国内外已经有越来越多的企业开始使用物流机器人,本文盘点了近年来比较受欢迎的九款物流机器人。随着人工成本上涨,未来送货机器人取代快递小哥,将成为趋势。近年超抢手的快递小哥们是否也会面临失业局面? 一、Kiva 2
机器人网
2018/04/23
1.1K0
快递小哥要失业了!盘点九款给力的送货机器人
巨头押注万亿智慧物流市场,还将诞生大量独角兽
2017年物流行业最大的热点便是智能化。智慧物流将彻底改变现在的物流经营体系,同时也蕴藏着巨大的机会,不只是物流快递行业,许多行业都会分享到智慧物流的蛋糕,对于创业者来说,智慧物流则是一个新风口,产生大量的独角兽企业将是必然。 智慧物流成了新风口 人工智能、物联网和机器人等新技术正在改变各行各业,交通、零售、制造、物流等等。其中,劳动力密集型的物流行业被改变较为明显。在此之前,电子面单、手持巴枪和信息系统的应用实现了物流各个环节的数据收集,物流大数据为智能物流打下基础。今天在AI、物联网和机器人技术趋于成熟
罗超频道
2018/04/25
8290
巨头押注万亿智慧物流市场,还将诞生大量独角兽
碰货为王,电商快递正式进入“1+3+X”时代
11月底唯品会抛弃自营品骏快递,转身与顺丰战略合作,将唯品会包裹配送托付给顺丰,该事传达出两层意思,一是头部快递企业顺丰正在求变,以往多次被“限流”的电商件正在被其用来“增流”;二是腰尾部中小型快递正经历“生死劫”,即使背靠唯品会,品骏快递也忍不住要在2019年跟快递行业说“再见”。
曾响铃
2019/12/23
4820
碰货为王,电商快递正式进入“1+3+X”时代
盘点!10种拣货技术及参数分享
纸单拣选,RF拣选,语音拣选,电子标签拣选,Carousel拣选,Miniload拣选,AutoStore,Kiva,Multi-Shuttle等等,各种拣货技术从本质上来说无所谓好坏之分,其关键点在于成本与效率或效益的匹配,换句话说就是投入和产出的匹配度如何。
老King
2021/04/26
1.8K0
优地科技顾震江:配送机器人,解决快递即时送达的痛点 | 镁客请讲
人工智能、无人驾驶等技术近年来实现巨大飞跃,关于机器是否会取代人工的争论成为久经不散的热门话题。
镁客网
2019/03/08
7920
电商大量部署仓储机器人,工作岗位真的会大量流失吗?
在亚马逊位于英格兰曼切斯特的大仓库,工业舞曲日以继夜响个不停。 笔直的货架在轻快地移动,仿佛在跳华尔兹舞。它们在其它货架的前进方向进进出出,围绕着静态的储物架不停移动,前后左右能够自如转向行走,且不会碰到任何其它的东西。 而进行这种优雅的移动的是一群低调朴实的“演出者”:轮子上的矮宽橘色机器,它们只有16英寸高,卡在货架底下即可使用,即可将货架移动到目的地点。 仓库中唯一的人类工作者在机器人的封闭区域周围,货架被移动到那里之后,供员工通过围栏的窗口根据计算机屏幕上的指示拣取货物。 亚马逊欧洲配送
机器人网
2018/04/25
5190
电商大量部署仓储机器人,工作岗位真的会大量流失吗?
原创|长文|孙子兵法| 百万级订单如何“拆零拣选”?
大家好,我是智能仓储物流技术研习社,社长,老K。距离前一篇:“整箱自动化拣选的秘密”有一段时间了,老K打算这次斗胆再分享一下拆零拣选的自动化拣选的内容。
老King
2020/08/04
1.3K0
电商拣选难题亟待破解,AMR能否提供新思路?
电商订单海量化、碎片化、个性化的特点,使促销高峰期间的拆零拣选作业难度大幅增加。面对待解难题,许多新锐企业带来全新思路与解决方案,为今年“618”增添一抹亮色,Syrius炬星就是其中的代表之一。
用户9868602
2022/09/02
6010
电商拣选难题亟待破解,AMR能否提供新思路?
亚马逊仓库机器人翻倍 引爆整个物流机器人市场
文/ Eugene Demaitre 尽管亚马逊给其仓库增加了一倍的机器人,但为了即将来临的假日季,它仍然多雇佣了10万名工人。 电商巨头亚马逊已经雇佣了25000名员工,但是去年它还是聘请了8万多季节性工人。据著名的美国咨询公司Challenger,Gray & Christmas报道,跟大多数实体商店不同的是,由于电商的需求,亚马逊雇佣了更多的工人。 CEO John Challerger说,“在过去,假日工大多数都是在销售区及收银台面向客户的职位。这些额外增加的员工也帮忙在幕后挑拣货物,帮助接收和存放
机器人网
2018/04/20
8030
亚马逊仓库机器人翻倍 引爆整个物流机器人市场
阿里、京东、苏宁又“掐架”,目标直指智能物流 2017年8月10日
进入8月以来,阿里巴巴、京东、苏宁等中国电子商务的领军企业,又开始了新一轮竞争:一方面,随着“818”这个商家喜欢的讨口彩的时间节点临近,各家企业纷纷推出最新的营销活动;但另一方面,不同企业之间的竞争不再是针锋相对的“价格战”,而是看似巧合地纷纷披露了自身在智能物流领域的最新进展。 其实,这已经不是巨头们第一次展示自身的物流实力了。只不过在以往的“双11”、“618”等大促中,“送得快”、“送得准”的物流服务被认为是提升消费者满意度的手段,但眼下物流实力不仅意味着企业服务消费者的能力,也意味着企业服务商家
机器人网
2018/05/04
7440
阿里、京东、苏宁又“掐架”,目标直指智能物流      2017年8月10日
推荐阅读
相关推荐
仓储自动化与机器人协同:难点、技术解决方案及案例分析
更多 >
LV.8
这个人很懒,什么都没有留下~
目录
  • 一、vector概述
  • 二、vector定义摘要
  • 三、vector的迭代器
  • 四、vector的数据结构
  • 五、vector的构造与内存管理(constructor、push_back)
    • vector的内存管理
    • 构造函数
    • push_back()函数
  • 六、vector内存重分配策略
    • Windows下
    • Linux下
  • 七、vector的元素操作(pop_back、erase、clear、insert)
    • pop_back
    • erase
    • clear
    • insert
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档