почему v3 ничего не возвращает, даже если входы равны - PullRequest
0 голосов
/ 21 сентября 2019

Мне нужно выдвинуть одинаковые элементы из v1 и v2 в v3, почему вектор v3 остается пустым, когда входные данные имеют вид

  • v1: 1 2 3 4 5
  • v2: 3 4 5 6 7 8

логическая ошибка или помощь?

и т. Д. Использование STL функция это дает ошибка сегмента но если я увеличу размер 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;
}

Ответы [ 3 ]

1 голос
/ 21 сентября 2019

Во втором 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]);
    }
1 голос
/ 21 сентября 2019

Не было необходимости отказываться от 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
0 голосов
/ 21 сентября 2019

Чтобы ваша функция работала (и чтобы std::set_intersection работала) оба контейнера v1 и v2 должны быть отсортированы.

После сортировки контейнеров вы можете использовать std::set_intersection.Единственной вашей ошибкой было использование v3:

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

, поскольку ваш вектор v3 был пуст, итератор немедленно достиг бы недопустимого состояния, если вы просто передадите v3.begin().back_inserter будет в основном увеличивать вектор автоматически.

...