Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 求两个字符串向量的交集_C++_Algorithm_Vector - Fatal编程技术网

C++ 求两个字符串向量的交集

C++ 求两个字符串向量的交集,c++,algorithm,vector,C++,Algorithm,Vector,我有两个字符串向量,希望找到这两个向量中的字符串,用公共元素填充第三个向量。编辑:我已经添加了完整的代码清单和相应的输出,这样事情就清楚了 std::cout << "size " << m_HLTMap->size() << std::endl; /// Vector to store the wanted, present and found triggers std::vector<std::string> wantedT

我有两个字符串向量,希望找到这两个向量中的字符串,用公共元素填充第三个向量。编辑:我已经添加了完整的代码清单和相应的输出,这样事情就清楚了

  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
可能原因 我开始认为应该归咎于我编译代码的方式。我目前正在使用ROOT来编译物理数据分析框架,而不是单独编译。我觉得STL算法库不能很好地工作,这就是问题的原因,特别是考虑到有多少人似乎有代码为他们工作。我将尝试进行独立编译并重新运行。

传递foundTriggers.begin,foundTriggers为空,因为输出参数不会导致输出推送到foundTriggers上。相反,它将增加迭代器,使其超过向量的末尾,而不调整其大小,从而随机损坏内存

您要使用插入迭代器:

std::set_intersection(wFirst, wLast, aFirst, aLast, 
    std::back_inserter(foundTriggers));
更新:正如注释中所指出的,向量的大小被调整为至少足以容纳结果,因此您的代码应该可以工作。请注意,您应该使用set_intersection返回的迭代器来指示交集的结束-您的代码将忽略它,因此您还将对输出结束时留下的空字符串进行迭代

您能否发布一个完整的测试用例,以便我们查看交叉点是否实际为空?

传递foundTriggers.begin,foundTriggers为空,因为输出参数不会导致输出被推送到foundTriggers上。相反,它将增加迭代器,使其超过向量的末尾,而不调整其大小,从而随机损坏内存

您要使用插入迭代器:

std::set_intersection(wFirst, wLast, aFirst, aLast, 
    std::back_inserter(foundTriggers));
更新:正如注释中所指出的,向量的大小被调整为至少足以容纳结果,因此您的代码应该可以工作。请注意,您应该使用set_intersection返回的迭代器来指示交集的结束-您的代码将忽略它,因此您还将对输出结束时留下的空字符串进行迭代


您能否发布一个完整的测试用例,以便我们查看交叉点是否为空?

您从不使用set\u intersection的返回值。在这种情况下,您可以使用它在返回set_交集后调整FoundIterator的大小,或者作为for循环的上限。否则,您的代码似乎可以工作。我们能看到完整的可编译程序及其实际输出吗?

您从不使用set\u intersection的返回值。在这种情况下,您可以使用它在返回set_交集后调整FoundIterator的大小,或者作为for循环的上限。否则,您的代码似乎可以工作。我们能看到完整的可编译程序及其实际输出吗?

毕竟,您的allTrigers向量是空的。填充地图时,从不将itr重置为地图的开头

编辑:

实际上,您从未重新设置过:

我希望您现在可以了解为什么缩小变量范围是一个好的做法。

毕竟,您的allTrigers向量是空的。填充地图时,从不将itr重置为地图的开头

编辑:

实际上,您从未重新设置过:


我希望您现在可以了解为什么缩小变量范围是一种好的做法。

您的allTriggers似乎为空,因此我希望交叉点也为空。或者您是在填充它吗?如果您查看中的示例,例如for std::set_intersection,您会看到目标集合被创建为空,并用于插入到目标中。你试过了吗?@AndyProwl我实际上从一个映射中填充了所有触发器,因为这是正确填充的,所以我没有考虑它以提高可读性。@JoachimPileborg我看到的大多数示例都预先分配了目标向量,然后使用了我所用的语法。我现在就把插入器放回去。@JacoboBlanco:你能告诉我你是怎么填满所有触发器的吗?我尝试将wantedTriggers的第一个元素推入allTriggers,并且交叉点的行为正常。您的allTriggers似乎为空,因此我希望交叉点也为空。或者您是在填充它吗?如果您查看中的示例,例如for std::set_intersection,您会看到目标集合被创建为空,并用于插入到目标中。你试过了吗?@AndyProwl我实际上从一个映射中填充了所有触发器,因为这是正确填充的,所以我没有考虑它以提高可读性。@JoachimPileborg我看到的大多数示例都预先分配了目标向量,然后使用了我所用的语法。我现在就把插入器放回去。@JacoboBlanco:你能告诉我你是怎么填满所有触发器的吗?我试图将wantedTriggers的第一个元素推送到allTriggers中,交集的行为正常,但他确实初始化了foundTriggers以包含适当数量的元素,所以应该是这样的
workI找到了一些预先分配目标向量,然后只使用destinatio.begin的示例。我现在就来试试。@AndyProwl set\u交集如何知道何时停止递增输出迭代器?它不能,所以当交叉点大于它的尺寸时,它就从foundTriggers的末端跑出来。@AndyProwl:他就是这么做的。当时未发布的代码可能有问题。@jrok:调用方只需确保目标范围足够大即可。这就是为什么如果目标集合为空,则必须使用back_插入器,但他确实初始化了foundTriggers以包含适当数量的元素,因此应该可以工作。我找到了一些示例,这些示例预先分配了目标向量,然后只使用destinatio.begin。我现在就来试试。@AndyProwl set\u交集如何知道何时停止递增输出迭代器?它不能,所以当交叉点大于它的尺寸时,它就从foundTriggers的末端跑出来。@AndyProwl:他就是这么做的。当时未发布的代码可能有问题。@jrok:调用方只需确保目标范围足够大即可。这就是为什么如果您的目标集合为空,您必须使用back_inserter的原因。对不起,我只是在调试时添加了这一点,但在将其发布到此处之前从未运行过,我最真诚的道歉。向量填写正确。很抱歉,我只是在调试时添加了它,但在发布到这里之前从未运行过它,我最真诚的道歉。向量填充正确。我已经包含了输出,问题是我使用了一些根库和根数据文件作为我的m_HLTNameMap源,因此我无法提供完全可编译的源。我将首先修复我提到的问题,因为它可能会给您带来一些混乱。报告为Find this many triggers:的数量将是您在构建foundTriggers时给出的大小。顺便说一句,您的代码示例仍然没有按原样编译-例如,affirst没有声明。我的错误是,affirst已声明,您已经使用back_inserter修复了这个问题。我没有注意到自上次查看以来代码发生了多大的变化。jrok有当前问题的答案。我已经包括了输出,问题是我使用一些根库和根数据文件作为我的m_HLTNameMap源,因此我无法提供完全可编译的源。我将首先修复我提到的问题,因为它可能会给您带来一些混乱。报告为Find this many triggers:的数量将是您在构建foundTriggers时给出的大小。顺便说一句,您的代码示例仍然没有按原样编译-例如,affirst没有声明。我的错误是,affirst已声明,您已经使用back_inserter修复了这个问题。我没有注意到自上次查看以来代码发生了多大的变化。jrok有当前问题的答案。
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 *****