我有两个字符串向量,想要找到两者中存在的字符串,用公共元素填充第三个向量。编辑:我已经添加了相应输出的完整代码清单,以便清楚。
std::cout << "size " << m_HLTMap->size() << std::endl;
/// Vector to store the wanted, present and found triggers
std::vector<std::string> wantedTriggers;
wantedTriggers.push_back("L2_xe25");
wantedTriggers.push_back("L2_vtxbeamspot_FSTracks_L2Star_A");
std::vector<std::string> allTriggers;
// Push all the trigger names to a vector
std::map<std::string, int>::iterator itr = m_HLTMap->begin();
std::map<std::string, int>::iterator itrLast = m_HLTMap->end();
for(;itr!=itrLast;++itr)
{
allTriggers.push_back((*itr).first);
}; // End itr
/// Sort the list of trigger names and find the intersection
/// Build a typdef to make things clearer
std::vector<std::string>::iterator wFirst = wantedTriggers.begin();
std::vector<std::string>::iterator wLast = wantedTriggers.end();
std::vector<std::string>::iterator aFirst = allTriggers.begin();
std::vector<std::string>::iterator aLast = allTriggers.end();
std::vector<std::string> foundTriggers;
for(;aFirst!=aLast;++aFirst)
{
std::cout << "Found:" << (*aFirst) << std::endl;
};
std::vector<std::string>::iterator it;
std::sort(wFirst, wLast);
std::sort(aFirst, aLast);
std::set_intersection(wFirst, wLast, aFirst, aLast, back_inserter(foundTriggers));
std::cout << "Found this many triggers: " << foundTriggers.size() << std::endl;
for(it=foundTriggers.begin();it!=foundTriggers.end();++it)
{
std::cout << "Found in both" << (*it) << std::endl;
}; // End for intersection
然后输出
这是部分输出,向量中有超过1000个元素,所以我没有包含完整的输出:
Found:L2_te1400
Found:L2_te1600
Found:L2_te600
Found:L2_trk16_Central_Tau_IDCalib
Found:L2_trk16_Fwd_Tau_IDCalib
Found:L2_trk29_Central_Tau_IDCalib
Found:L2_trk29_Fwd_Tau_IDCalib
Found:L2_trk9_Central_Tau_IDCalib
Found:L2_trk9_Fwd_Tau_IDCalib
Found:L2_vtxbeamspot_FSTracks_L2Star_A
Found:L2_vtxbeamspot_FSTracks_L2Star_B
Found:L2_vtxbeamspot_activeTE_L2Star_A_peb
Found:L2_vtxbeamspot_activeTE_L2Star_B_peb
Found:L2_vtxbeamspot_allTE_L2Star_A_peb
Found:L2_vtxbeamspot_allTE_L2Star_B_peb
Found:L2_xe25
Found:L2_xe35
Found:L2_xe40
Found:L2_xe45
Found:L2_xe45T
Found:L2_xe55
Found:L2_xe55T
Found:L2_xe55_LArNoiseBurst
Found:L2_xe65
Found:L2_xe65_tight
Found:L2_xe75
Found:L2_xe90
Found:L2_xe90_tight
Found:L2_xe_NoCut_allL1
Found:L2_xs15
Found:L2_xs30
Found:L2_xs45
Found:L2_xs50
Found:L2_xs60
Found:L2_xs65
Found:L2_zerobias_NoAlg
Found:L2_zerobias_Overlay_NoAlg
Found this many triggers: 0
我开始认为编译代码的方式是责备。我目前正在使用ROOT(物理数据分析框架)进行编译,而不是进行独立编译。我觉得它与STL算法库不能很好地工作,这就是问题的原因,特别是考虑到有多少人似乎有代码为他们工作。我将尝试进行独立编译并重新运行。
答案 0 :(得分:5)
传递foundTriggers.begin()
,foundTriggers
为空,因为输出参数不会导致输出被推送到foundTriggers
。相反,它会将迭代器递增超过向量的末尾而不调整大小,随机破坏内存。
您想使用插入迭代器:
std::set_intersection(wFirst, wLast, aFirst, aLast,
std::back_inserter(foundTriggers));
更新:正如评论中所指出的那样,向量的大小至少要足够大,以便结果,所以你的代码应该有效。请注意,您应该使用从set_intersection
返回的迭代器来指示交集的结束 - 您的代码会忽略它,因此您还将迭代输出结尾处留下的空字符串。
您是否可以发布完整的测试用例,以便我们可以看到交叉点是否实际为空?
答案 1 :(得分:4)
您的 allTrigers
向量 为空,全部为空。当你填充地图时,你永远不会将itr
重置为地图的开头。
编辑:
实际上,您永远不会重置aFirst
:
for(;aFirst!=aLast;++aFirst)
{
std::cout << "Found:" << (*aFirst) << std::endl;
};
// here aFirst == aLast
std::vector<std::string>::iterator it;
std::sort(wFirst, wLast);
std::sort(aFirst, aLast); // **** sorting empty range ****
std::set_intersection(wFirst, wLast, aFirst, aLast, back_inserter(foundTrigger));
// ^^^^^^^^^^^^^^
// ***** empty range *****
我希望您现在可以了解为什么缩小变量范围是一种好习惯。
答案 2 :(得分:1)
您永远不会使用set_intersection
的返回值。在这种情况下,您可以在foundIterators
返回后使用它来调整set_intersection
的大小,或者作为for循环的上限。否则你的代码似乎工作。我们能看到一个完整的可编辑程序及其实际输出吗?