Как найти минимум вектора

How can I find the minimum value from a vector?

int main()
{
    int v[100] = { 5, 14, 2, 4, 6 };
    int n = 5;
    int mic = v[0];
enter code here
    for (int i=0; i < v[n]; i++)
    {
        if (v[i] < mic)
            mic = v[i];
    }
    cout< < mic;
}

But is not working, what can I do?

AustinWBryan's user avatar

AustinWBryan

3,2493 gold badges23 silver badges42 bronze badges

asked Oct 22, 2012 at 16:44

Cristi DroPs's user avatar

4

See std::min_element.

Examples:

std::min_element(vec.begin(), vec.end()); // STL containers.
std::min_element(v, v + n); // C style arrays where n is the number of elements.
std::min_element(std::begin(v), std::end(v)); // STL containers and C style arrays. 

Note that for the last option, it is better to apply the ‘std 2-step’ pattern so it works for user-defined types as well as standard library types:

using std::begin, std::end; // Enables argument-dependent lookup: https://en.cppreference.com/w/cpp/language/adl
std::min_element(begin(v), end(v));

Since C++20, we can also use ranges to avoid having to call begin/end manually:

std::ranges::min_element(v);

Ayxan Haqverdili's user avatar

answered Oct 22, 2012 at 16:48

zabulus's user avatar

zabuluszabulus

2,3533 gold badges15 silver badges27 bronze badges

7

You can always use the stl:

auto min_value = *std::min_element(v.begin(),v.end());

Humam Helfawi's user avatar

Humam Helfawi

19.4k14 gold badges80 silver badges159 bronze badges

answered Oct 22, 2012 at 16:58

acrube's user avatar

acrubeacrube

7711 gold badge5 silver badges5 bronze badges

1

#include <iostream>
#include <vector>
#include <algorithm> // std::min_element
#include <iterator>  // std::begin, std::end

int main() {
    std::vector<int> v = {5,14,2,4,6};
    auto result = std::min_element(std::begin(v), std::end(v));
    if (std::end(v)!=result)
        std::cout << *result << 'n';
}

The program you show has a few problems, the primary culprit being the for condition: i<v[n]. You initialize the array, setting the first 5 elements to various values and the rest to zero. n is set to the number of elements you explicitly initialized so v[n] is the first element that was implicitly initialized to zero. Therefore the loop condition is false the first time around and the loop does not run at all; your code simply prints out the first element.

Some minor issues:

  • avoid raw arrays; they behave strangely and inconsistently (e.g., implicit conversion to pointer to the array’s first element, can’t be assigned, can’t be passed to/returned from functions by value)

  • avoid magic numbers. int v[100] is an invitation to a bug if you want your array to get input from somewhere and then try to handle more than 100 elements.

  • avoid using namespace std; It’s not a big deal in implementation files, although IMO it’s better to just get used to explicit qualification, but it can cause problems if you blindly use it everywhere because you’ll put it in header files and start causing unnecessary name conflicts.

answered Oct 22, 2012 at 16:48

bames53's user avatar

bames53bames53

85.5k15 gold badges177 silver badges243 bronze badges

2

You have an error in your code. This line:

for (int i = 0;i < v[n]; i++)

should be

for (int i = 0;i < n; i++)

because you want to search n places in your vector, not v[n] places (which wouldn’t mean anything)

AustinWBryan's user avatar

AustinWBryan

3,2493 gold badges23 silver badges42 bronze badges

answered Oct 22, 2012 at 16:49

alestanis's user avatar

alestanisalestanis

21.5k4 gold badges47 silver badges66 bronze badges

1

template <class ForwardIterator>
ForwardIterator min_element ( ForwardIterator first, ForwardIterator last )
{
    ForwardIterator lowest = first;
    if (first == last) 
        return last;

    while (++first != last)
    if (*first < *lowest) 
        lowest = first;
    return lowest;
}

AustinWBryan's user avatar

AustinWBryan

3,2493 gold badges23 silver badges42 bronze badges

answered Oct 22, 2012 at 17:26

lovaya's user avatar

lovayalovaya

4353 silver badges3 bronze badges

1

Try this with

 std::min_element(v.begin(),v.end())

answered Oct 22, 2012 at 16:49

Rahul Tripathi's user avatar

Rahul TripathiRahul Tripathi

167k31 gold badges277 silver badges330 bronze badges

#include <iostream>
int main()
{
    int v[100] = {5,14,2,4,6};
    int n = 5;
    int mic = v[0];
    for(int i = 0; i != n; ++i)
    {
        if(v[i] < mic)
        mic = v[i];
    }
    std:cout << mic << std::endl;;
}

answered Oct 22, 2012 at 17:30

lovaya's user avatar

lovayalovaya

4353 silver badges3 bronze badges

В этом посте мы обсудим, как найти минимальное или максимальное значение в векторе на C++.

1. Использование std::max_element

The std::min_element а также std::max_element вернуть итератору минимальное и максимальное значение в указанном диапазоне соответственно. В следующем примере кода показан вызов обеих этих функций:

#include <iostream>

#include <vector>

#include <algorithm>

int main()

{

    std::vector<int> v = {2, 1, 3, 6, 7, 9, 8};

    int max = *max_element(v.begin(), v.end());

    int min = *min_element(v.begin(), v.end());

    std::cout << min << «, « << max << std::endl;        // 1, 9

    return 0;

}

Скачать  Выполнить код

 
Обе эти функции принимают бинарный предикат, который можно использовать для сравнения вектора объектов с использованием определенного поля, как показано ниже:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#include <iostream>

#include <vector>

#include <algorithm>

struct Person {

    std::string name;

    int age;

};

bool comp(Person const &lhs, Person const &rhs) {

    return lhs.age < rhs.age;

}

int main()

{

    std::vector<Person> v = {

        {«A», 10}, {«B», 15}, {«C», 12}, {«D», 14}

    };

    auto min = std::min_element(v.begin(), v.end(), comp);

    auto max = std::max_element(v.begin(), v.end(), comp);

    std::cout << «Minimum age object: (« << min->name << «, « << min->age << «)n»;

    std::cout << «Maximum age object: (« << max->name << «, « << max->age << «)n»;

    return 0;

}

Скачать  Выполнить код

результат:

Minimum age object: (A, 10)
Maximum age object: (B, 15)

2. Использование std::minmax_element

Лучшим вариантом является использование std::minmax_element функция для получения минимального и максимального количества элементов в контейнере. Он возвращает пару итераторов, первое и второе значения которых указывают на минимальный и максимальный элементы соответственно.

#include <iostream>

#include <vector>

#include <algorithm>

int main()

{

    std::vector<int> v = {2, 1, 3, 6, 7, 9, 8};

    auto it = std::minmax_element(v.begin(), v.end());

    int min = *it.first;

    int max = *it.second;

    std::cout << min << «, « << max << std::endl;        // 1, 9

    return 0;

}

Скачать  Выполнить код

 
Чтобы получить индекс элементов с максимальным или минимальным значением, примените арифметику указателя или вызовите std::distance функция.

#include <iostream>

#include <vector>

#include <algorithm>

int main()

{

    std::vector<int> v = {2, 1, 3, 6, 7, 9, 8};

    auto it = std::minmax_element(v.begin(), v.end());

    int min_idx = std::distance(v.begin(), it.first);

    int max_idx = std::distance(v.begin(), it.second);

    std::cout << min_idx << «, « << max_idx << std::endl;        // 1, 5

    return 0;

}

Скачать  Выполнить код

3. Использование пользовательской процедуры

Наконец, мы можем написать вашу собственную процедуру, чтобы найти минимальное и максимальное значение в векторе. Вот как будет выглядеть код:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

#include <iostream>

#include <vector>

#include <climits>

template<typename T>

int findMaximum(std::vector<T> const &vec) {

    int max = INT_MIN;

    for (const T &i: vec) {

        if (max < i) {

             max = i;

        }

    }

    return max;

}

template<typename T>

int findMinimum(std::vector<T> const &vec) {

    int min = INT_MAX;

    for (const T &i: vec) {

        if (min > i) {

             min = i;

        }

    }

    return min;

}

int main()

{

    std::vector<int> v = {2, 1, 3, 6, 7, 9, 8};

    int min = findMinimum(v);

    int max = findMaximum(v);

    std::cout << min << «, « << max << std::endl;        // 1, 9

    return 0;

}

Скачать  Выполнить код

Это все о поиске минимального или максимального значения в векторе в C++.

Спасибо за чтение.

Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.

Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования :)

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Given a vector, find the minimum and maximum element of this vector using STL in C++. Example:

    Input: {1, 45, 54, 71, 76, 12}
    Output: min = 1, max = 76
    
    Input: {10, 7, 5, 4, 6, 12}
    Output: min = 1, max = 76

    Approach:

    • Min or Minimum element can be found with the help of *min_element() function provided in STL.
    • Max or Maximum element can be found with the help of *max_element() function provided in STL.

    Syntax:

    *min_element (first_index, last_index);
    
    *max_element (first_index, last_index);

    Below is the implementation of the above approach: 

    CPP

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

      vector<int> a = { 1, 45, 54, 71, 76, 12 };

      cout << "Vector: ";

      for (int i = 0; i < a.size(); i++)

        cout << a[i] << " ";

      cout << endl;

      cout << "nMin Element = "

        << *min_element(a.begin(), a.end());

      cout << "nMax Element = "

        << *max_element(a.begin(), a.end());

      return 0;

    }

    Output:

    Vector: 1 45 54 71 76 12 
    
    Min Element = 1
    Max Element = 76

    Time Complexity: O(N)
    Auxiliary Space: O(1)

    Last Updated :
    07 Jul, 2022

    Like Article

    Save Article

    10 / 10 / 4

    Регистрация: 11.10.2012

    Сообщений: 93

    1

    Найти минимальные в векторе

    16.11.2012, 14:21. Показов 12364. Ответов 13


    Студворк — интернет-сервис помощи студентам

    в векторе n элементов, необходимо сделать следующее — находить минимальное среди элементов таким образом:

    b1,min(b1,b2),min(b1,b2,b3)…min(bn).



    0



    Kuzia domovenok

    4023 / 3280 / 920

    Регистрация: 25.03.2012

    Сообщений: 12,263

    Записей в блоге: 1

    16.11.2012, 14:27

    2

    не понял каким образом?
    Что это за последовательность b1,min(b1,b2),min(b1,b2,b3)…min(bn)?
    Чем предлагаемый способ отличается от классического нахождения минимума

    C++
    1
    2
    3
    4
    
    min=0;
    for (int i=1; i<v.size(); i++)
      if (v[i]>v[min]) min=i;
    return v[min];



    0



    gray_fox

    What a waste!

    1607 / 1299 / 180

    Регистрация: 21.04.2012

    Сообщений: 2,727

    16.11.2012, 14:40

    3

    snw, так?

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    #include <iostream>
    #include <algorithm>
    #include <iterator>
     
     
    int main() {
       int vector[] = {1, 2, 3, -45, 324, -55, 23, -34, 6};
     
       std::size_t const size = sizeof (vector) / sizeof (*vector);
       int result[size];
       for (std::size_t i = 0; i != size; ++i) {
          result[i] = *std::min_element(&vector[0], &vector[0] + i + 1);
       }
     
       std::copy(&result[0], &result[0] + size, std::ostream_iterator<int>(std::cout, " "));
       std::cout << std::endl;
    }

    http://ideone.com/rCjkIJ



    1



    10 / 10 / 4

    Регистрация: 11.10.2012

    Сообщений: 93

    16.11.2012, 14:41

     [ТС]

    4

    Как я сам понял надо в каждый последующий элемент вектора, помещать минимальный элемент, из числа элементов, которое зависит от порядкового номера поэтому так —
    b1,min(b1,b2),min(b1,b2,b3)…



    0



    gray_fox

    What a waste!

    1607 / 1299 / 180

    Регистрация: 21.04.2012

    Сообщений: 2,727

    16.11.2012, 14:43

    5

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    #include <iostream>
    #include <algorithm>
    #include <iterator>
     
     
    int main() {
       int vector[] = {1, 2, 3, -45, 324, -55, 23, -34, 6};
     
       std::size_t const size = sizeof (vector) / sizeof (*vector);
       int result[size];
       result[0] = vector[0];
       for (std::size_t i = 1; i < size; ++i) {
          result[i] = std::min(result[i - 1], vector[i]);
       }
     
       std::copy(&result[0], &result[0] + size, std::ostream_iterator<int>(std::cout, " "));
       std::cout << std::endl;
    }

    http://ideone.com/rCjkIJ



    1



    I.M.

    574 / 557 / 47

    Регистрация: 16.12.2011

    Сообщений: 1,389

    16.11.2012, 14:44

    6

    gray_fox, странное сочетание

    C++
    1
    2
    3
    4
    
    #include <algorithm>
    #include <iterator>
    //...
    std::min_element

    и

    C++
    1
    2
    3
    
    int vector[] = {1, 2, 3, -45, 324, -55, 23, -34, 6};
     
       std::size_t const size = sizeof (vector) / sizeof (*vector);

    какое-то непоследовательное использование STL



    0



    What a waste!

    1607 / 1299 / 180

    Регистрация: 21.04.2012

    Сообщений: 2,727

    16.11.2012, 14:48

    7

    Цитата
    Сообщение от I.M.
    Посмотреть сообщение

    какое-то непоследовательное использование STL

    Не совсем понял. Последовательно — это с std::vector, или как?

    Добавлено через 1 минуту
    а std::min_element здесь конечно не нужен.



    0



    574 / 557 / 47

    Регистрация: 16.12.2011

    Сообщений: 1,389

    16.11.2012, 14:49

    8

    gray_fox, угу, std::vector или std::array. Смотря что нужно от контейнера + итераторы. Хотя на итераторах не настаиваю многие индексы больше любят



    0



    What a waste!

    1607 / 1299 / 180

    Регистрация: 21.04.2012

    Сообщений: 2,727

    16.11.2012, 14:52

    9

    Цитата
    Сообщение от I.M.
    Посмотреть сообщение

    std::array

    Ну это C++11-only, как и список инициализации.



    0



    snw

    10 / 10 / 4

    Регистрация: 11.10.2012

    Сообщений: 93

    16.11.2012, 17:24

     [ТС]

    10

    А по поводу итераторов, я пытался сделать через них, но выскакивает ошибка — vector iterator not incrementable

    Так не идет

    Добавлено через 39 минут

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    
    #include <fstream>
    #include <vector>
    #include <iterator>
    #include <ctime>
    #include <algorithm>
     
    using namespace std;
     
    struct RandomInt
    {
    int operator()(){return (rand() % 30 + (-10));}
    };
     
     
    std::ostream &operator << (std::ostream &stream, std::vector<int> &vector)
    {
        copy(vector.begin(), vector.end(), std::ostream_iterator<int>(stream, " "));
        return stream;
    }
     
     
    int main()
    {
        srand(time(NULL));
        setlocale(LC_ALL,"Rus");
        
        ofstream out("output.txt");
        vector<int> sequence;
        vector<int> vec;
        
        vector<int>::iterator it;
        
        generate_n(back_inserter(sequence), 4 + rand() % 10, RandomInt());
        
        size_t const size = 50;
        
        int result[size];
        
        
        out << sequence << " ";
        int i;
        for(it = sequence.begin(), i = 1; it < sequence.end(); ++it, ++i)
        {
                
            result[i] = min(result[i - 1], *it);
            
            vec.push_back(result[i]);
     
        }
     
        out << endl << vec << " ";
    }



    0



    gray_fox

    What a waste!

    1607 / 1299 / 180

    Регистрация: 21.04.2012

    Сообщений: 2,727

    16.11.2012, 17:35

    11

    Попробуй так:

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    
    #include <fstream>
    #include <vector>
    #include <iterator>
    #include <ctime>
    #include <algorithm>
     
    // using namespace std;
     
    struct RandomInt
    {
    int operator()(){return (rand() % 30 + (-10));}
    };
     
     
    std::ostream &operator << (std::ostream &stream, std::vector<int> &vector)
    {
        copy(vector.begin(), vector.end(), std::ostream_iterator<int>(stream, " "));
        return stream;
    }
     
     
    using namespace std;
     
     
    int main()
    {
        srand(time(NULL));
        setlocale(LC_ALL,"Rus");
        
        ofstream out("output.txt");
        vector<int> sequence;
        vector<int> vec;
        
        vector<int>::iterator it;
        
        generate_n(back_inserter(sequence), 4 + rand() % 10, RandomInt());
        
        // size_t const size = 50;
        
       //  int result[size];
        
        
        out << sequence << " ";
        if (!sequence.empty()) {
            vector<int>::const_iterator cIt = sequence.begin();
            vec.push_back(*cIt);
            while (++cIt != sequence.end()) {
               vec.push_back(std::min(vec.back(), *cIt));
            }
        }
        // int i;    
        // for(it = sequence.begin(), i = 1; it < sequence.end(); ++it, ++i)
        // {
                
            // result[i] = min(result[i - 1], *it);
            
            // vec.push_back(result[i]);
     
        // }
     
        out << endl << vec << " ";
    }



    1



    4023 / 3280 / 920

    Регистрация: 25.03.2012

    Сообщений: 12,263

    Записей в блоге: 1

    16.11.2012, 17:42

    12

    Цитата
    Сообщение от gray_fox
    Посмотреть сообщение

    Попробуй так:

    Человек только начинает программировать, и начинать это следует с переменных и действий над ними,
    С функций и массивов,
    с битовых операций и размещения переменных в памяти
    с адресов этих переменных, с понятия указателей.
    далее переходить к структурам данным,
    строить самостоятельно стеки/очереди/деревья/списки
    научить создавать собственные шаблоны для всего этого.
    Начать осваивать ООП…
    и затем уже перейти к тому, что в STL это тоже реализовано
    Иначе, человек не поймёт, какие действия производит процессор при «vec.push_back(*cIt);»



    0



    What a waste!

    1607 / 1299 / 180

    Регистрация: 21.04.2012

    Сообщений: 2,727

    16.11.2012, 17:47

    13

    Kuzia domovenok, : я просто поправил его код, и там тоже было это ваше СТЛ.



    0



    snw

    10 / 10 / 4

    Регистрация: 11.10.2012

    Сообщений: 93

    19.11.2012, 14:18

     [ТС]

    14

    C++
    1
    
    vec.push_back(*cIt);

    положить в вектор vec, данные находящиеся по адресу *cIt.



    0



    Example

    To find the largest or smallest element stored in a vector, you can use the methods std::max_element and std::min_element, respectively. These methods are defined in <algorithm> header. If several elements are equivalent to the greatest (smallest) element, the methods return the iterator to the first such element. Return v.end() for empty vectors.

    std::vector<int> v = {5, 2, 8, 10, 9}; 
    int maxElementIndex = std::max_element(v.begin(),v.end()) - v.begin();
    int maxElement = *std::max_element(v.begin(), v.end());
    
    int minElementIndex = std::min_element(v.begin(),v.end()) - v.begin();
    int minElement = *std::min_element(v.begin(), v.end());
    
    std::cout << "maxElementIndex:" << maxElementIndex << ", maxElement:" << maxElement << 'n';
    std::cout << "minElementIndex:" << minElementIndex << ", minElement:" << minElement << 'n';
    

    Output:

    maxElementIndex:3, maxElement:10
    minElementIndex:1, minElement:2

    C++11

    The minimum and maximum element in a vector can be retrieved at the same time by using the method std::minmax_element, which is also defined in <algorithm> header:

    std::vector<int> v = {5, 2, 8, 10, 9}; 
    auto minmax = std::minmax_element(v.begin(), v.end());
    
    std::cout << "minimum element: " << *minmax.first << 'n';
    std::cout << "maximum element: " << *minmax.second << 'n';
    

    Output:

    minimum element: 2
    maximum element: 10

    Понравилась статья? Поделить с друзьями:

    Не пропустите также:

  • Как найти высату пирамиды
  • Как найти энергию конденсатора по рисунку
  • Как найти где вода под землей
  • Как найти имущество ооо
  • Как найти xmax физика

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии