61
|
John Carter · 技术社区 · 16 年前 |
![]() |
1
30
弗里奥的方法和你的方法结合起来很好。首先,构建一个由数字1组成的向量 n ,以及向量中指示排序顺序的元素:
现在,您可以使用自定义排序器对这个数组进行排序:
现在你已经掌握了内部重新排列的顺序
|
![]() |
2
10
现在,您可以使用“索引”向量对“值”向量进行索引。 |
![]() |
3
8
把你的价值观放在 Boost Multi-Index container 然后迭代以按所需顺序读取值。如果你愿意,你甚至可以将它们复制到另一个向量上。 |
![]() |
4
4
我只想到一个粗略的解决方案:创建一个向量,它是所有其他向量的总和(一个结构向量,如{3,Third,…},{1,First,…}),然后按第一个字段对这个向量进行排序,然后再次拆分这些结构。
|
![]() |
5
3
您可能可以定义一个自定义的“facade”迭代器,在这里执行您需要的操作。它会将迭代器存储到所有向量中,或者从第一个向量的偏移量中导出除第一个向量之外的所有向量的迭代器。棘手的部分是迭代器解引用的内容:想想boost::tuple之类的东西,巧妙地使用boost::tie。(如果你想扩展这个想法,你可以使用模板递归构建这些迭代器类型,但你可能永远不想写下它的类型——所以你要么需要c++0x auto,要么需要一个接受范围的排序包装函数) |
![]() |
6
3
我认为你 真正地 need(但如果我错了,请纠正我)是一种以某种顺序访问容器元素的方法。 与其重新排列我的原始收藏,我会借用数据库设计中的一个概念:按照一定的标准排列索引。该索引是一种额外的间接方式,提供了极大的灵活性。 这样,就可以根据类的不同成员生成多个索引。
|
![]() |
7
1
如果你只是想基于单个向量迭代所有向量,xtofl的答案有一个稍微紧凑的变体
|
![]() |
8
1
ltjax的答案是一个很好的方法,它实际上是在boost的zip_iterator中实现的 http://www.boost.org/doc/libs/1_43_0/libs/iterator/doc/zip_iterator.html 它将你提供的任何迭代器打包成一个元组。 然后,您可以根据元组中迭代器值的任何组合为排序创建自己的比较函数。对于这个问题,它只是元组中的第一个迭代器。 这种方法的一个优点是,它允许您保持每个单独向量的内存连续(如果您正在使用向量,这就是您想要的)。您也不需要存储单独的int索引向量。 |
![]() |
9
1
这将是Konrad答案的补充,因为它是一种将排序顺序应用于向量的就地变体的方法。不管怎样,既然编辑不成功,我就把它放在这里 这是一个时间复杂度稍高的就地变体,这是由于检查布尔值的原始操作造成的。额外的空间复杂性是一个向量,它可以是一个空间高效的编译器依赖实现。如果给定的顺序本身可以修改,则可以消除向量的复杂性。 这是一个时间复杂度稍高的就地变体,这是由于检查布尔值的原始操作造成的。额外的空间复杂性是一个向量,它可以是一个空间高效的编译器依赖实现。如果给定的顺序本身可以修改,则可以消除向量的复杂性。这是算法正在做的一个例子。 如果顺序是3 0 4 1 2,则由位置索引指示的元素的移动将是3-->;0;0---->1、 1--->3、 2-->;4、 4--->2.
|
![]() |
10
0
下面是一个相对简单的实现,使用
索引映射
有序与无序之间
为了完整起见,以下是函数
以及:
最后,
|
![]() |
11
0
|
![]() |
12
0
基于Konrad Rudolph和Gabriele D'Antonia的答案,使用C++11 lambdas和STL算法:
|
![]() |
13
-2
很多人问了这个问题,但没有人给出令人满意的答案。这里有一个std::sort助手,它能够同时对两个向量进行排序,只考虑一个向量的值。该解决方案基于自定义RadomIt(随机迭代器),直接对原始向量数据进行操作,无需临时复制、结构重排或额外索引: |
![]() |
zayd · 在C中Boost程序选项创建的矢量上迭代++ 1 年前 |
![]() |
Mimi · CMake使用了错误的boost include目录 1 年前 |
![]() |
zxctatar · 如何在一个类中运行两个异步定时器 1 年前 |
![]() |
Adrian · 如何确定boost::可选的(和其他)API? 1 年前 |
![]() |
TooTone · boost-pfr是如何获取结构的字段名称的? 1 年前 |