Как вернуть вектор пар - PullRequest
       156

Как вернуть вектор пар

0 голосов
/ 16 февраля 2020

Я пытаюсь решить эту проблему из testdome. Я думаю, что мой подход к решению не является оптимальным (или даже правильным). Но перед тем, как изменить свой подход, мне было интересно, можно ли вернуть вектор пар? если да, то как? Ниже вы увидите вызов, а затем мой код. Спасибо. enter image description here


#include <stdexcept>
#include <iostream>
#include <vector>
#include <utility>

std::pair<int, int> findTwoSum(const std::vector<int>& list, int sum)
{
    int tracker = list.size();
    std::pair <int, int> result;
    std::vector <std::pair <int,int>> list1(100);
    for (int i = 0; i < (int)list.size(); i++){
        for (int j = ((int)list.size()-tracker); j < (int)list.size(); j++){

            if (list[i]+list[j] == sum)
                list1.push_back(std::make_pair(list[i], list[j]) );
        }
        tracker--;
    }

    return list1; // I am stuck here

    //throw std::logic_error("Waiting to be implemented");
}

#ifndef RunTests
int main()
{
    std::vector<int> list = {3, 1, 5, 7, 5, 9};
    std::pair<int, int> indices = findTwoSum(list, 10);
    std::cout << indices.first << '\n' << indices.second;
}
#endif

РЕДАКТИРОВАТЬ

Изначально это было мое решение. Но как только я разместил это на testdome, я получаю ноль правильных ответов из 4 категорий. Это тест номер 5 . Вот почему я подумал, что возвращать только один ответ было неправильно.


#include <stdexcept>
#include <iostream>
#include <vector>
#include <utility>

std::pair<int, int> findTwoSum(const std::vector<int>& list, int sum)
{
    int tracker = list.size();
    std::pair <int, int> result;
    std::vector <std::pair <int,int>> list1(100);
    for (int i = 0; i < (int)list.size(); i++){
        for (int j = ((int)list.size()-tracker); j < (int)list.size(); j++){
            if (list[i]+list[j] == sum)

                return result=std::make_pair(list[i], list[j]);
        }
        tracker--;
    }

    return std::make_pair(-1,-1);

    //throw std::logic_error("Waiting to be implemented");
}

#ifndef RunTests
int main()
{
    std::vector<int> list = {3, 1, 5, 7, 5, 9};
    std::pair<int, int> indices = findTwoSum(list, 10);
    std::cout << indices.first << '\n' << indices.second;
}
#endif

Ответы [ 5 ]

1 голос
/ 16 февраля 2020

Использование может сделать это:

 std::vector<std::pair<int, int> >findTwoSum(const 
      std::vector<int>& list, int sum)
{
    int tracker = list.size();
    std::pair <int, int> result;
    std::vector <std::pair <int,int>> list1(100);
    /* ...*/
     return list1; 
  }
  int main()
 {
      std::vector<int> list = {3, 1, 5, 7, 5, 9};
      auto indices = findTwoSum(list, 10);
      std::cout << indices[0].first << '\n' << indices[0].second;
 }
0 голосов
/ 16 февраля 2020

Если вы используете C ++ 17, у вас есть два варианта:

  1. использовать auto вычет типа возврата
auto create_vector_of_pairs() {
    std::vector<std::pair<int, int>> v;
    v.emplace_back(1, 2);
    v.emplace_back(3, 4);
    v.emplace_back(5, 6);
    return v;
}
используйте std::vector<std::pair<...>> в качестве типа возвращаемого значения
std::vector<std::pair<int, int>> create_vector_of_pairs() {
    std::vector<std::pair<int, int>> v;
    v.emplace_back(1, 2);
    v.emplace_back(3, 4);
    v.emplace_back(5, 6);
    return v;
}

Тогда, какой бы вариант вы не указали выше, в вашей основной функции вы можете сделать что-то вроде:

std::vector<std::pair<int, int>> v = create_vector_of_pairs();

или

auto v = create_vector_of_pairs();
0 голосов
/ 16 февраля 2020

вам просто нужно переключить сигнатуру функции на

std::vector<std::pair<int, int>> findTwoSum(const std::vector<int>& list, int sum)

Но в основном вы назначаете ее на пару, поэтому вам также нужно изменить это:

std::pair<int, int> indices = findTwoSum(list, 10); // from
std::vector<std::pair<int, int>> indices = findTwoSum(list, 10); // to
std::vector<std::pair<int, int>> indices { findTwoSum(list, 10) }; // but this is better because you call just one constructor instead of a default constructor and a copy constructor
0 голосов
/ 16 февраля 2020

Если вы хотите вернуть вектор пар, ваша сигнатура функции должна выглядеть следующим образом:

std::vector<std::pair<...>> f();

Ваша текущая функция просто возвращает один std::pair.

0 голосов
/ 16 февраля 2020

Вы можете просто использовать std::vector<std::pair<int, int>> в качестве возвращаемого значения вашей функции. (и не только std::pair<int, int>, как вы сделали в своем примере)

Таким образом, ваша функция становится:

std::vector<std::pair<int, int>> findTwoSum(const std::vector<int>& list, int sum) { ... }
...