可修改组多集的:两级分选容器

我有以下三个级数据结构(底部到顶部):可修改组多集的:两级分选容器

  1. 对象C{string, T, float}(其中T是还有一个目的)

  2. 排序容器对象BC与相同string由最高浮子第一

  3. 分类的容器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()和东西都做(BC)比较成两级的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

回到顶部