- 主题:std:vector怎么做截取?
已经有了一个vector A了
现在想截取vector A的某一段,譬如第3-10个元素,
要求形成一个新的vector B,但是其实际还是存储在原先的vector中,怎么做?
实际中有不少这样的需求。你需要用新的vector B去到第三方库中进行调用,但是又不想重复分配资源。
--
FROM 58.246.115.*
【 在 granis 的大作中提到: 】
: 已经有了一个vector A了
: 现在想截取vector A的某一段,譬如第3-10个元素,
: 要求形成一个新的vector B,但是其实际还是存储在原先的vector中,怎么做?
: ...................
C++20中的std::span
--
FROM 171.212.243.*
span是不是要改接口?
但是第三方库动不了。
【 在 perduamour 的大作中提到: 】
:
: C++20中的std::span
--
FROM 58.246.115.*
试试自定义内存分配器?
【 在 granis 的大作中提到: 】
: 已经有了一个vector A了
: 现在想截取vector A的某一段,譬如第3-10个元素,
: 要求形成一个新的vector B,但是其实际还是存储在原先的vector中,怎么做?
: ...................
--来自微微水木3.5.12
--
FROM 39.144.104.*
第一步,通过 profiling 确定这个部分是不是性能瓶颈。
第二步,确定第三方库能否修改接口。
第三步,确定第三方库会不会修改输入参数。
第四步,确定你们能不能接受第五步的各种潜在坑。
第五步,调用第三方库前,直接修改 std::vector 对象的内存内容。调用结束后,再改回来。
--
FROM 124.217.188.*
自己定义一个类?
【 在 granis 的大作中提到: 】
: 已经有了一个vector A了
: 现在想截取vector A的某一段,譬如第3-10个元素,
: 要求形成一个新的vector B,但是其实际还是存储在原先的vector中,怎么做?
: ...................
--
FROM 117.81.73.*
【 在 granis 的大作中提到: 】
: 已经有了一个vector A了
: 现在想截取vector A的某一段,譬如第3-10个元素,
: 要求形成一个新的vector B,但是其实际还是存储在原先的vector中,怎么做?
: ...................
为什么要两个动态对象共享一块内部存储? 如果一个动态扩充,重新分配并释放旧的内存,
另一个就失效了。
如果,能确定知道大小,并不会释放内存, 那么,作为一个普通数组来使用也不是不可以。
如果,第三方库确实需要使用vector,那么做个移动拷贝, 或者用一个空vector对象调用swap交换出存储空间
也是可以的吧
--
FROM 124.126.2.*
swap能交换出片段的地址么?
移动copy是有可行性
能否给个例子?
【 在 poggy 的大作中提到: 】
:
: 为什么要两个动态对象共享一块内部存储? 如果一个动态扩充,重新分配并释放旧的内存,
: 另一个就失效了。
: ...................
--
FROM 58.246.115.*
这种情况应该直接传递指针
【 在 granis 的大作中提到: 】
: 已经有了一个vector A了
: 现在想截取vector A的某一段,譬如第3-10个元素,
: 要求形成一个新的vector B,但是其实际还是存储在原先的vector中,怎么做?
: ...................
--
FROM 121.69.95.*
【 在 granis 的大作中提到: 】
: swap能交换出片段的地址么?
: 移动copy是有可行性
: 能否给个例子?
: ...................
你的需求我理解就是取vector的一部分, 就假定是连续的部分吧
一种是元素太大, 比如是对象, 那么可以考虑用move构造
auto v = std::vector<std::string>({"1", "2", "3", "4", "5" });
auto & v2 =std::vector<std::string>(std::make_move_iterator(v.begin()+2),std::make_move_iterator(std::end(v)));
v2 变成{"3", "4", "5" }, 这三个元素对象, 是接管了v的
v则变成{"1", "2", "", "", "" }, 三个对象被交换成空的string
v的元素是string对象, v2构造的化, 会用空对象, 交换掉v中对应索引的string对象
这样可以减少大量的元素构造析构。
不过, 这种情况可能不适用POD对象, 比如vector<int> 实际上还是要拷贝分配空间拷贝
对象, 也会拷贝, 不过只是拷贝对象的索引指针。
如果, 对象不多,可以erase掉多余的元素, 这个调用类似move的内存拷贝,可能会移动元素指针,
不过, 如果是一次连续操作,也许可以接受。
swap就是两个vector交换内容
auto v = std::vector<std::string>({"1", "2", "3", "4", "5" });
auto v2 = std::vector<std::string>({"x", "y", "z"});
v2.swap(v), 那么v管理{"x", "y", "z"}
v2则管理 {"1", "2", "3", "4", "5" }
又是可以定义一个空vector,取接管其它vector。
--
修改:poggy FROM 124.126.2.*
FROM 124.126.2.*