- 主题:std:vector怎么做截取?
新的不是一个vector,只是一个view。
跟std::string_view是类似的东西,不是数据的owner。
vector一定是数据的owner。
--
FROM 222.130.137.*
std::range::view
【 在 granis 的大作中提到: 】
: 已经有了一个vector A了
: 现在想截取vector A的某一段,譬如第3-10个元素,
: 要求形成一个新的vector B,但是其实际还是存储在原先的vector中,怎么做?
: ...................
--
FROM 67.186.83.*
谢谢,感觉不太能满足需求。
感觉自定义Allocator是否能够满足?其实就相当于一个Vecotor的元素引用一个已经存在的大的连续内存中的某一个连续的块。
【 在 poggy 的大作中提到: 】
:
: 你的需求我理解就是取vector的一部分, 就假定是连续的部分吧
: 一种是元素太大, 比如是对象, 那么可以考虑用move构造
: ...................
--
FROM 101.88.101.*
最简单的, 仿造string_view, 搞一个vecter_view对象
【 在 granis 的大作中提到: 】
: 已经有了一个vector A了
: 现在想截取vector A的某一段,譬如第3-10个元素,
: 要求形成一个新的vector B,但是其实际还是存储在原先的vector中,怎么做?
: ...................
--
FROM 120.244.224.*
新增的std::span就是现成的view,楼主的问题是没法改别人的接口,所以需要一个确实是vector的东西,又不拥有数据,那就只能是继承vector的类,可以从vector初始化,但是析构函数得空操作。
但是各家vector实现不一样,继承也是个麻烦事,还不如自己寨出来vector的接口,内部只保留原vector的引用,就相当于自己写一个继承了vector的span。
【 在 hyperLee 的大作中提到: 】
: 最简单的, 仿造string\_view, 搞一个vecter\_view对象
: --
发自「今日水木 on 钛星」
--
修改:ble FROM 222.129.50.*
FROM 222.129.50.*
如果你能保证vector首次就满足容量,不发生re alloate。
我觉得可以这样实现。
自定义allocator。加两个全局变量,一个记录地址,一个记录偏移。
alloctor内部记录一下分配的地址,并提供一个访问改地址是接口。
分片时,通过接口,全局变量记录原始vector的分配的地址,以及需要的偏移,alloctor判断改全局变量不为空,则直接返回偏移地址。切记,这时construct函数不能初始化内存,alloctor可以在allocate时记录一个标识。
析构和deallocate同理。
然后全局变量清空。
【 在 granis 的大作中提到: 】
: 谢谢,感觉不太能满足需求。
: 感觉自定义Allocator是否能够满足?其实就相当于一个Vecotor的元素引用一个已经存在的大的连续内存中的某一个连续的块。
:
: ...................
--来自微微水木3.5.12
--
修改:foliver FROM 140.206.194.*
FROM 140.206.194.*
【 在 foliver 的大作中提到: 】
: 如果你能保证vector首次就满足容量,不发生re alloate。
: 我觉得可以这样实现。
: 自定义allocator。加两个全局变量,一个记录地址,一个记录偏移。
: ...................
我感觉这个偏离原始问题了,
原始问题是第三方库,需要一个vector参数, 而构造一个只管理一部分内存还是由另一个vector管理的对象,
这本身就是个矛盾,第三方库的vector和转换前的vector都对这个内存有处置权,这是冲突的。
最好的方法就是第三方库有多态接口, 既接受vector, 也接受原始数组, 这样通过vector直接传data()指针就可以当原始数组使用了
--
FROM 124.126.2.*
参数不要传vector,传迭代器
【 在 granis 的大作中提到: 】
已经有了一个vector A了
现在想截取vector A的某一段,譬如第3-10个元素,
要求形成一个新的vector B,但是其实际还是存储在原先的vector中,怎么做?
实际中有不少这样的需求。你需要用新的vector B去到第三方库中进行调用,但是又不想重复分配资源。
--
FROM 123.118.102.201
显然他改不了,要不传下标也是一样的
【 在 blueboats 的大作中提到: 】
: 参数不要传vector,传迭代器
: 已经有了一个vector A了
: 现在想截取vector A的某一段,譬如第3-10个元素,
: ...................
--
FROM 222.130.137.*
也是,这点还是java好一些,java自带的各种容器类型都提供了很多view可以用。
C++里原本的理念应该是可以通过传迭代器作为参数来解决这个问题的,但是参数限定是容器类型就没办法了。
【 在 z16166 的大作中提到: 】
显然他改不了,要不传下标也是一样的
【 在 blueboats 的大作中提到: 】
: 参数不要传vector,传迭代器
: 已经有了一个vector A了
: 现在想截取vector A的某一段,譬如第3-10个元素,
: ...................
--
修改:blueboats FROM 123.118.102.201
FROM 123.118.102.201