Извлечение значений из 2 векторов на основе индекса максимального значения C ++ - PullRequest
1 голос
/ 26 февраля 2020

Я новичок ie программист, пытающийся привыкнуть работать с векторами. В следующем коде я смог найти максимальное значение вектора "V" и вернуть его в main. Вместо этого мне нужно вернуть значение из другого вектора, соответствующего индексу максимального значения. В этом случае для вектора "V" максимальное значение составляет 65,25, я хочу, чтобы функция возвращала 0,05 от вектора "freq" (тот же индекс). Эти значения взяты из предыдущих расчетов с использованием матриц, добавляя результаты к вектору методом push_back, мне просто нужно извлечь 0,05 для дальнейших операций. Помощь очень ценится.

#include <iostream>
#include <vector>
#include <cmath>
#include <cfloat>

using namespace std;
double maxAt(vector<double> &Lvec); // MaxL value func prototype


int main() {

    vector <double> freq = {0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07};
    vector <double> V ={0, 0, 0, 0, 65.25, 0,6};
    double MaxV = maxAt(V);
    cout << MaxV << endl;
    return 0;
}



double maxAt(vector<double> &V) {
    double Lmax = DBL_MIN;
    for (auto val : V) {
         if (Lmax < val) Lmax = val;
    } 
    return Lmax;
}

Ответы [ 2 ]

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

Нет необходимости изобретать собственную функцию, которая ищет максимум. Вы можете использовать стандартные функции.

Вот и вы.

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

int main() 
{
    std::vector<double> freq = { 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07 };
    std::vector<double> V = { 0, 0, 0, 0, 65.25, 0,6 };

    auto it = std::max_element( std::begin( V ), std::end( V ) );

    std::cout << *it << " -> " 
              << *std::next( std::begin( freq ), std::distance( std::begin( V  ), it ) )
              << '\n';

    return 0;
}

Выход программы:

65.25 -> 0.05

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

#include <iostream>
#include <vector>

auto maxAt( const std::vector<double> &V ) 
{
    std::vector<double>::size_type max = 0;

    for ( std::vector<double>::size_type i = 1; i < v.size(); i++  ) 
    {
         if ( V[max] < V[i] ) max = i;
    } 

    return max;
}

int main() 
{
    std::vector<double> freq = { 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07 };
    std::vector<double> V = { 0, 0, 0, 0, 65.25, 0,6 };

    auto pos = maxAt( V );

    std::cout << V[pos] << " -> " 
              << *freq[pos]
              << '\n';

    return 0;
}

Вывод программы такой же, как показано выше

65.25 -> 0.05
0 голосов
/ 26 февраля 2020

Вы можете сделать:

double maxAt(vector<double> &V, vector<double> &freq) {
    double Lmax = DBL_MIN;
    double Lfreq = DBL_MIN;
    for (size_t i = 0; i < V.size(); ++i) {
         if (Lmax < V[i]) {
             Lmax = V[i];
             Lfreq = freq[i];
         }
    } 
    return Lfreq;
}

Также, смотрите здесь для ответа, который использует стандартные алгоритмы: Нахождение позиции максимального элемента

...