Как получить минимальное значение из вектора с (значение > 0)

Я пытаюсь уменьшить на некоторое значение все элементы вектора, которые не равны или меньше 0.

Я действительно ничего не пробовал, потому что я просто не могу с этим справиться, но мне нужно, например, из vector{1, 2, 3, 0, -1} значение vector[0] Я не хочу сортировать или удалять какое-либо значение, мне нужно, чтобы вектор сохранял свою «структуру».

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> R;
    //I'm sorry I can't provide any code, I can't get around with this
}

Я ожидаю, например: от векторов

A = {1, 2, 3, 4, 0, -1}
B = {53, 36, 205, -8, -45, -93}

получить:

A[0]
B[1]

(Это просто случайные векторы, чтобы сделать несколько примеров)

Эта проблема была бы намного проще, если бы вы могли сначала отсортировать свои векторы.

François Andrieux 08.04.2019 15:16

А затем удалите все неположительные значения.

YSC 08.04.2019 15:16

Если бы еще были функции std::sort или std::remove_if... Черт!

YSC 08.04.2019 15:17

Зачем тебе сортировать??

Matthieu Brucher 08.04.2019 15:18

Извините, что не упомянул об этом, но я действительно не хочу менять структуру моего вектора, если он (4,2,3,0), он должен остаться (4,2,3,0 )

PlayLikeMe10YT 08.04.2019 15:20

Или создайте два указателя, один из которых начинается с начала, а другой — с конца вектора. Сравните оба значения, отсортируйте наименьшее из неотрицательных и продолжайте движение до конца, также известного как центр вектора (хранение и сравнение каждый раз, когда наименьшее найденное значение) Надеюсь, я был понятен... (Более эффективно, чем сортировка, а затем пройти через век)

Benoît 08.04.2019 15:20

Ну, по крайней мере, ваш заголовок понятен. Если вы не дошли до этого, то спросите себя, как бы вы нашли минимум без каких-либо дополнительных ограничений. Просто минимум в векторе. Затем подумайте, как впихнуть туда дополнительные условия.

StoryTeller - Unslander Monica 08.04.2019 15:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
736
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать пользовательское накопление следующим образом:

#include <algorithm>
#include <iostream>
#include <vector>
#include <limits> //std::numeric_limits
#include <numeric> //std::accumulate
#include <iterator> //std::begin, std::end

int main()
{
    std::vector<int> R{1, 2, 3, 4, 0, -1};

    std::cout << std::accumulate(std::begin(R), std::end(R), std::numeric_limits<int>::max(), 
      [](int a, int b){if (b > 0) return std::min(a, b); return a;});
}

Он возвращает максимальное значение для целого числа, если в векторе нет строго положительных элементов.

Действительно, спасибо! копирование/вставка запрещена, когда буфер обмена содержит «#include». Безумно глупый...

Matthieu Brucher 08.04.2019 15:32

Я был так впечатлен тем, что для одной строки требуется 4 включения из стандартной библиотеки, поэтому мне пришлось предложить редактирование. (5, если считать iostream) ха-ха

Stack Danny 08.04.2019 15:33

FWIW std::begin и std::end не обязательно включать iterator. весь контейнер включает (<array>, <deque>, <forward_list>, <list>, <map>, <regex>, <set>, <span>, <string>, <string_view>, <unordered_map>, <unordered_set> и <vector>) гарантированно будут включены. Эмпирическое правило: если у вас есть контейнер, вы получаете начало и конец бесплатно.

NathanOliver 08.04.2019 15:37

Это пример использования довольно неизвестного std::lower_bound:

int smallest_positive(std::vector<int> v)
{
    std::sort(begin(v), end(v));
    return *std::lower_bound(begin(v), end(v), 0);
}

std::sort(begin(v), end(v));

Это сортирует копировать входного вектора. Для простых случаев это лучшее усилие/производительность, которое вы можете получить;)


[std::lower_bound] returns an iterator pointing to the first element in the range [first, last) that is not less than (i.e. greater or equal to) value, or last if no such element is found.

std::lower_bound(begin(v), end(v), 1);

Это сканирует отсортированный v на предмет первого неотрицательного элемента (не меньше 1) и возвращает ему итератор. Осторожно, он возвращает недопустимый итератор, если ни один элемент v не является положительным. Я позволю тебе это исправить ;)

@PlayLikeMe10YT Вы прочитали последние два предложения, прежде чем получили пятерку?

YSC 08.04.2019 15:37

и, пожалуйста, добавьте этот #include <алгоритм> (я просто новичок, но я не знал, что мне это нужно, это может быть полезно для других людей)

PlayLikeMe10YT 08.04.2019 15:37

Что такое Ф-?

PlayLikeMe10YT 08.04.2019 15:40

@MatthieuBrucher вектор передается по значению этой функции.

Stack Danny 08.04.2019 15:47

Тем не менее, хуже сложность, выделенная память... Стоит ли продолжать?

Matthieu Brucher 08.04.2019 15:48

Я пробовал, и этот код на самом деле не изменяет мою векторную структуру, а также меня не волнуют отрицательные целые числа, потому что у меня всегда есть что-то большее, чем 0 в векторе. Я принимаю этот ответ, потому что его проще всего понять, я не говорю, что ваш ответ неверен. Извините, если я кажусь таким глупым, я просто новичок. Спасибо.

PlayLikeMe10YT 08.04.2019 15:53

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

Matthieu Brucher 08.04.2019 15:58

@MatthieuBrucher Иногда вам не нужен ДА ЛУЧШИЙ, а просто что-то в порядке. Это такое время.

YSC 08.04.2019 15:59

Ну есть ОК и есть ОК. Если я пройду собеседование, а парень сделает это вместо накопления, он не получит работу. Если парень делает пулреквест с этим кодом вместо аккумулирования, он не проходит ревью.

Matthieu Brucher 08.04.2019 16:01

Я должен задаться вопросом, как все эти новые учителя аскеров с гарантированным using namespace std; примут эти современные функции.

Stack Danny 08.04.2019 16:02

@PlayLikeMe10YT • "Извините, если я кажусь таким глупым, я просто новичок." Это тяжело. Это сложно на любом языке. C++ сложнее, чем многие другие языки, по уважительным и историческим причинам. И то, как обычно преподается C++, делает его еще более ошеломляющим и сбивающим с толку. В качестве альтернативного способа преподавания C++ в более доброй, мягкой и доступной манере см. q.v. youtube.com/watch?v=YnWhqhNdYyk

Eljay 08.04.2019 16:23

@MatthieuBrucher Ну, я не проходил собеседование, не так ли?

YSC 08.04.2019 16:43

Ребята, мой учитель на самом деле не учитель, лол, я имею в виду, единственное, чему он учил, это HTML, и я уже знал это, я сам исследую это новое слово, и я просто иногда ищу помощи, спасибо за все ответы <3

PlayLikeMe10YT 08.04.2019 17:34

Другие вопросы по теме