【问题标题】:why v3 does not return anything even when inputs are equal为什么即使输入相等 v3 也不返回任何内容
【发布时间】:2019-09-21 17:25:50
【问题描述】:

我需要将相同的元素从 v1 和 v2 推送到 v3 为什么当输入像

时 v3 向量仍然是空的
  • v1 :1 2 3 4 5
  • v2:3 4 5 6 7 8

逻辑有缺陷还是有帮助?

等等 使用 STL 函数会产生 seg fault 但是如果我增加 v3 的大小,那么不需要的 0 就会被打印出来 v3 只需要与 v1 v2 中的元素相同

vector<int> commonElements(vector<int>v1, vector<int>v2)
{
    vector<int>v3;

   // set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin());
   for(int i=0;i<v1.size();i++)
    for(int j=i+1;j<v2.size();j++)
    {
        if(v1[i]==v2[j])
            v3.push_back(v1[i]);
    }

    return v3;
}

【问题讨论】:

  • 你在i+i开始j循环,所以你只检查v2的最后一部分。从 j=0 开始
  • std::set_intersection 使用std::back_inserter 完成所有这些工作。你为什么把它注释掉?

标签: c++ vector output logic


【解决方案1】:

没有必要放弃std::set_intersection。问题是接收结果的容器需要适当调整大小以容纳结果。

如果您使用了std::back_inserter() 迭代器,则可以使用空向量:

#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>

std::vector<int> commonElements(const std::vector<int>& v1, const std::vector<int>& v2)
{
    std::vector<int> v3;
    set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(), std::back_inserter(v3));
    return v3;
}

int main()
{
   auto test = commonElements({1,2,3,4,5}, {4,5,6,7,8});
   for (auto &v : test )
     std::cout << v << " ";
}

输出:

4 5

【讨论】:

    【解决方案2】:

    第二个for 必须是j = 0 而不是j = i+1

       for(int i=0;i<v1.size();i++)
        for(int j=i+1;j<v2.size();j++)
        {
            if(v1[i]==v2[j])
                v3.push_back(v1[i]);
        }
    

    【讨论】:

      【解决方案3】:

      为了使您的函数正常工作(以及为了使std::set_intersection 正常工作),v1v2 两个容器都必须进行排序。

      容器排序后,您可以使用std::set_intersection。您唯一的错误是使用了v3

      set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v3));
      

      由于你的向量v3 是空的,如果你只传递v3.begin(),迭代器将立即达到无效状态。 back_inserter 基本上会自动增长向量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-19
        • 1970-01-01
        • 2012-04-02
        • 2018-01-24
        • 2013-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多