可修改组多集的:两级分选容器
我有以下三个级数据结构(底部到顶部):可修改组多集的:两级分选容器
对象
C
:{string, T, float}
(其中T是还有一个目的)排序容器对象
B
C
与相同string
由最高浮子第一分类的容器
A
物体B
最低max(C.float)
(即,B[0]
)第一
所以一开始我有一堆C
与预先计算float
价值观和我的数据结构应该是这样的:
A: B:
C:
string: "one"
T: {object}
float: 10
C:
string: "one"
T: {object} # different from the above of course
float: 8.3
C:
string: "one"
T: {object}
float: -4
B:
C:
string: "two"
T: {object}
float: 15
C:
string: "two"
T: {object}
float: 2
C:
string: "two"
T: {object}
float: 0
没有困难的问题了到现在为止,我只是简单地把所有这些都放到一组集合(/ multisets)中并且完成它。这里是困难的地方:我将不得不提取它们的一个子集来计算我的问题的解决方案(每个B
的第一个C
)。如果没有解决方案,则删除最上面的C
并提取新的子集以再次尝试。在蟒蛇伪代码:
def get_list(): c_list = []
for b in A:
c_list.append(b[0]) # element in B with highest float value
return c_list
def solve():
for i in range(1, 3): # three tries
c_list = get_list()
# do stuff with c_list
if fail:
del A[0][0] # the topmost C element in the first B
continue
但是,当我删除此A[0][0]
(即C
与{"one", T, 10}
),我需要整个事情进行重新排序本身。因此,我不能使用set,因为我会修改A[0]
,STL set/multiset不允许。
另一个解决方案是创建类,定义每个两级我需要为std::sort()
和东西都做(B
和C
)比较成两级的operator()
或operator<
STL矢量。然而,这看起来过于复杂/我的非专业C++直觉告诉我们应该有一个更简单的方法来编写这个整洁。
性能是重要的,因为它是一个机器人“实时”的应用程序,但不是最紧要的事情,因为我只会说,有多达30 C
。
回答:
继David's suggestion使用std::vector
不过和this post,最简单的办法似乎是使用std::sort
用lambda表达式。这样一个人不需要定义任何额外的类(如在这种情况下的B
)或任何运算符重载。
class C { string type;
T obj;
float sat;
};
然后:
vector<vector<C>> c_list = getData(); // Sort Bs
auto b_sort = [] (const C& lhs, const C& rhs) { return lhs.sat > rhs.sat; };
for (auto&& b : c_set) {
sort(b.begin(), b.end(), b_sort);
}
// Sort A
sort(c_set.begin(), c_set.end(),
[] (const vector<C>& lhs, const vector<C>& rhs) { return lhs[0].sat < rhs[0].sat; });
在该溶液中,主要需要注意的是,当一个C
除去容器不是固有地排序。所以上面的排序必须手动调用。
回答:
看来你是按位置索引的,而不是价值。当您不需要通过密钥进行有效查找时,最简单的数据结构是std::vector
。我相信这会解决你的问题。
的std::set
容器为有序组值。
以上是 可修改组多集的:两级分选容器 的全部内容, 来源链接: utcz.com/qa/258695.html