C++ C++;:如何比较几个向量,然后生成一个包含所有向量的所有元素的新排序向量
更新:关于commenter 6502的答案,我有几个可能是愚蠢的问题(见下文)。如果有人能帮忙,我会非常感激 1) 我知道数据1和数据2是地图,但我不知道所有键的作用是什么。有人能解释一下吗 2) 我知道:data1[vector1[I].name]=vector1[I].value;意味着为感兴趣的地图指定一个值,其中正确的标签是。。。但我不明白这一点:vector1[I].name和vector1[I].value。“名称”和“值”不是标签和值的两个独立向量吗?那么他们在vector1上做什么?这不应该改为,名称[i]和值[i] 谢谢大家C++ C++;:如何比较几个向量,然后生成一个包含所有向量的所有元素的新排序向量,c++,sorting,vector,comparison,C++,Sorting,Vector,Comparison,更新:关于commenter 6502的答案,我有几个可能是愚蠢的问题(见下文)。如果有人能帮忙,我会非常感激 1) 我知道数据1和数据2是地图,但我不知道所有键的作用是什么。有人能解释一下吗 2) 我知道:data1[vector1[I].name]=vector1[I].value;意味着为感兴趣的地图指定一个值,其中正确的标签是。。。但我不明白这一点:vector1[I].name和vector1[I].value。“名称”和“值”不是标签和值的两个独立向量吗?那么他们在vector1上做
我已经编写了执行计算的代码。代码使用来自其他地方的数据。计算代码很好,但我在处理数据时遇到了问题 数据以向量集的形式存在。每个集合都有一个标签向量(名称,这些是字符串)和一组相应的值(double或int) 问题是,我需要每个数据集在同一列中与其他数据集具有相同的名称/标签。这个问题与对向量中的数据进行排序不同(我知道怎么做),因为有时某些向量中可能会缺少名称/标签 例如: 数据集1: 向量名称1=吉姆、汤姆、玛丽 向量值1=1 2 3 数据集2: 向量名称2=汤姆、玛丽、琼 向量值2=2 3 4 我想要(伪代码)一个包含所有可能名称的名称向量。我还希望每个对应的数字向量以相同的方式排序: 矢量名称通用=吉姆、琼、玛丽、汤姆 向量值Iversal1=1 0 3 2 向量值Iversal2=0 4 3 2 我想做的是得到一个通用向量,它包含所有按字母顺序排序的标签/名称,以及所有相应的数字数据
有人能告诉我,C++中是否有一种优雅的方式来实现这一点?我想我可以将每个名称向量的每个元素与另一个名称向量的每个元素进行比较,但这看起来相当笨拙,我不知道如何将数据放入相应数据向量的正确列中。谢谢您的建议。我认为您需要更改存储此数据的方式。 看起来你是说每个数字在逻辑上都与同一位置的名字相关联:Jim=1,Mary=3,等等 如果是这样,并且您想坚持使用某种
向量
,您可以像这样重做数据结构:
typedef std::pair<std::string, int> NameNumberPair;
typedef std::vector<NameNumberPair> NameNumberVector;
NameNumberVector v1;
typedef std::pair NameNumberPair;
typedef std::向量名称numbervector;
NameNumberVector v1;
您需要编写自己的
操作符想到的一个快速方法是使用映射
并使用正确的键将每个值存储在映射中。(例如,第一组中的(Tom,2)值将位于值为2的键(Tom,1)下)
一旦地图准备好了,就对其进行迭代并构建您想要的任何数据结构(假设地图对您来说还不够)。您正在寻找的算法通常被命名为“合并”。基本上,对两个数据集进行排序,然后成对查看数据:如果键相等,则处理并输出该对,否则仅处理并前进最小的一个
您还必须处理两个列表中的一个在另一个列表之前结束的情况(这可以通过使用保证高于需要处理的任何值的特殊标志值来避免)
下面是用于合并的伪代码
排序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]
输出合并数据,并同时递增index1
和index2
否则,如果vector1[index1]
outputvector1[index1++]
否则输出vector2[index2++]
但是,在C++中,您可以实现一个更容易编写的解决方案,它可能仍然足够快(警告:未经测试的代码):
std::映射数据1、数据2;
std::设置所有键;
对于(inti=0,n=vector1.size();i6502的解决方案乍一看很好。不过,您可能应该将其用于合并部分
编辑:
我忘了提一下,在STL的GNU版本中,现在还有一个STL的多路合并
扩展。它是并行模式的一部分,所以它位于名称空间\uu GNU\u parallel
。如果需要进行多路合并,很难想出像这样快速或简单的方法来使用.嗨,比尔。谢谢你的帮助。事实上,我这样写这个例子是巧合(对不起)用户:我很困惑:为什么第一个数字从123
变为1032
?哦,对不起,我误解了你。是的,你是对的。数字的顺序与名称相对应。因此,当名称的顺序改变了,我希望最终的结果是一个向量,包含所有可能的名称,加上几个数字向量,其中
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;
}