更新:我有一些关于评论者6502的答案的愚蠢问题(如下)。如果有人可以提供帮助,我将非常感激。

1)我知道数据1和数据2是映射,但是我不知道allkey的作用。谁能解释?

2)我知道:data1 [vector1 [i] .name] = vector1 [i] .value;意味着在感兴趣的地图上为正确的标签分配一个值...但是我不明白:vector1 [i] .name和vector1 [i] .value。 “名称”和“值”不是标签和值的两个单独的向量吗?那么他们在vector1上做什么?这不应该读为name [i]和value [i]吗?

感谢大家。



我已经编写了用于执行计算的代码。该代码使用其他地方的数据。计算代码很好,但是在处理数据时遇到了麻烦。

数据以向量集的形式存在。每个集合都有一个标签向量(名称,它们是字符串)和一组对应的值(双精度或整数)。

问题是我需要每个数据集在同一列中具有与其他数据集相同的名称/标签。这个问题与对向量中的数据进行排序(我知道该怎么做)不同,因为有时某些向量中可能缺少名称/标签。

例如:

数据集1:

矢量名称1 =吉姆,汤姆,玛丽

向量值1 = 1 2 3

数据集2:

矢量名称2 =汤姆,玛丽,琼

向量值2 = 2 3 4

我想要(伪代码)一个具有所有可能名称的名称向量。我也希望每个对应的数字向量都以相同的方式排序:

矢量名称通用=吉姆,琼,玛丽,汤姆

向量值Universal1 = 1 0 3 2

矢量值Universal2 = 0 4 3 2

我想做的是提供一个通用向量,其中包含所有按字母顺序排序的标签/名称以及所有相应的数值数据也排序。

谁能告诉我在c ++中是否有一种优雅的方法来做到这一点?我想我可以将每个名称向量的每个元素与每个其他名称向量的每个元素进行比较,但这似乎很笨拙,我不知道如何将数据放入相应数据向量的正确列中。感谢您的任何建议。

最佳答案

您要寻找的算法通常称为“合并”。基本上,您对两个数据集进行排序,然后成对查看数据:如果键相等,则处理并输出该对,否则仅处理并前进最小的一对。

您还必须处理两个列表之一在另一个列表之前结束的情况(可以通过使用保证比您需要处理的任何值都高的特殊标志值来避免这种情况)。

以下是用于合并的伪代码


排序vector1
排序vector2
设置index1 = index2 = 0;
循环直到index1 >= vector1.size()index2 >= vector2.size()(换句话说,直到两个向量都用尽)
如果index1 == vector1.size()(即是否已处理vector1),则输出vector2[index2++]
否则,如果index2 == vector2.size()(即如果已处理vector2),则输出vector1[index1++]
否则,如果vector1[index1] == vector2[index2]输出合并的数据并同时递增index1index2
否则,如果vector1[index1] < vector2[index2]输出vector1[index1++]
否则输出vector2[index2++]


但是,在C ++中,您可以实现一个更容易编写的解决方案,该解决方案可能仍然足够快(警告:未经测试的代码!):

std::map<std::string, int> data1, data2;
std::set<std::string> allkeys;

for (int i=0,n=vector1.size(); i<n; i++)
{
    allkeys.insert(vector1[i].name);
    data1[vector1[i].name] = vector1[i].value;
}

for (int i=0,n=vector2.size(); i<n; i++)
{
    allkeys.insert(vector2[i].name);
    data2[vector2[i].name] = vector2[i].value;
}

for (std::set<std::string>::iterator i=allkeys.begin(), e=allkeys.end();
     i!=e; ++i)
{
   const std::string& key = *i;
   std::cout << key << data1[key] << data2[key] << std::endl;
}


想法是只建立两个从名称到值的映射data1data2,并同时收集出现在名为std::set的键的allkeys中的所有键(将相同的名称添加到集合中)多次不执行任何操作)。

在收集阶段之后,可以迭代该集合以查找已观察到的所有名称,并且对于每个名称,可以从data1data2映射中检索值(std::map<std::string, int>在查找以下值时将返回0尚未添加到地图的名称)。

从技术上讲,这是一种过度杀伤(使用三个平衡树来执行只需要两个排序操作的处理),但是代码较少,而且无论如何还是可以接受的。

关于c++ - C++:如何比较多个 vector ,然后创建一个包含所有 vector 的所有元素的新排序 vector ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5058443/

10-10 19:23