Я пытаюсь уменьшить на некоторое значение все элементы вектора, которые не равны или меньше 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]
(Это просто случайные векторы, чтобы сделать несколько примеров)
А затем удалите все неположительные значения.
Если бы еще были функции std::sort
или std::remove_if
... Черт!
Зачем тебе сортировать??
Извините, что не упомянул об этом, но я действительно не хочу менять структуру моего вектора, если он (4,2,3,0), он должен остаться (4,2,3,0 )
Или создайте два указателя, один из которых начинается с начала, а другой — с конца вектора. Сравните оба значения, отсортируйте наименьшее из неотрицательных и продолжайте движение до конца, также известного как центр вектора (хранение и сравнение каждый раз, когда наименьшее найденное значение) Надеюсь, я был понятен... (Более эффективно, чем сортировка, а затем пройти через век)
Ну, по крайней мере, ваш заголовок понятен. Если вы не дошли до этого, то спросите себя, как бы вы нашли минимум без каких-либо дополнительных ограничений. Просто минимум в векторе. Затем подумайте, как впихнуть туда дополнительные условия.
Вы можете использовать пользовательское накопление следующим образом:
#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». Безумно глупый...
Я был так впечатлен тем, что для одной строки требуется 4 включения из стандартной библиотеки, поэтому мне пришлось предложить редактирование. (5, если считать iostream) ха-ха
FWIW std::begin
и std::end
не обязательно включать iterator
. весь контейнер включает (<array>, <deque>, <forward_list>, <list>, <map>, <regex>, <set>, <span>, <string>, <string_view>, <unordered_map>, <unordered_set> и <vector>) гарантированно будут включены. Эмпирическое правило: если у вас есть контейнер, вы получаете начало и конец бесплатно.
Это пример использования довольно неизвестного 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 Вы прочитали последние два предложения, прежде чем получили пятерку?
и, пожалуйста, добавьте этот #include <алгоритм> (я просто новичок, но я не знал, что мне это нужно, это может быть полезно для других людей)
Что такое Ф-?
@MatthieuBrucher вектор передается по значению этой функции.
Тем не менее, хуже сложность, выделенная память... Стоит ли продолжать?
Я пробовал, и этот код на самом деле не изменяет мою векторную структуру, а также меня не волнуют отрицательные целые числа, потому что у меня всегда есть что-то большее, чем 0 в векторе. Я принимаю этот ответ, потому что его проще всего понять, я не говорю, что ваш ответ неверен. Извините, если я кажусь таким глупым, я просто новичок. Спасибо.
Нет, ты не выглядишь глупо, но тебе нужно узнать о сложности и о том, что делает код. Ваш учитель также может не согласиться с вами, потому что в реальной жизни вы можете часто сталкиваться со случаями, когда ваш первоначальный контракт - это X, но в конечном итоге вы также имеете дело с Y, потому что на самом деле это сложнее.
@MatthieuBrucher Иногда вам не нужен ДА ЛУЧШИЙ, а просто что-то в порядке. Это такое время.
Ну есть ОК и есть ОК. Если я пройду собеседование, а парень сделает это вместо накопления, он не получит работу. Если парень делает пулреквест с этим кодом вместо аккумулирования, он не проходит ревью.
Я должен задаться вопросом, как все эти новые учителя аскеров с гарантированным using namespace std;
примут эти современные функции.
@PlayLikeMe10YT • "Извините, если я кажусь таким глупым, я просто новичок." Это тяжело. Это сложно на любом языке. C++ сложнее, чем многие другие языки, по уважительным и историческим причинам. И то, как обычно преподается C++, делает его еще более ошеломляющим и сбивающим с толку. В качестве альтернативного способа преподавания C++ в более доброй, мягкой и доступной манере см. q.v. youtube.com/watch?v=YnWhqhNdYyk
@MatthieuBrucher Ну, я не проходил собеседование, не так ли?
Ребята, мой учитель на самом деле не учитель, лол, я имею в виду, единственное, чему он учил, это HTML, и я уже знал это, я сам исследую это новое слово, и я просто иногда ищу помощи, спасибо за все ответы <3
Эта проблема была бы намного проще, если бы вы могли сначала отсортировать свои векторы.