Вопрос по заданию на С++ по библиотеке STL

132
15 декабря 2020, 18:40

Вот задание: Дан массив из N целых чисел. Найти среднее арифметическое элементов массива, кратных числу k. Поменять знак у всех элементов массива между первым максимальным и последним максимальным элементами. Если первый отрицательный элемент имеет четный индекс, то поменять местами части массива относительно этого элемента. Удалить из массива нулевые элементы. Отсортировать первую половину массива по возрастанию.

Код:

#define _CRT_SECURE_NO_WARNINGS 
#include <iostream> 
#include <stdio.h> 
#include <conio.h> 
#include <vector>
#include <string>
#include <algorithm>  
using namespace std;
int main () {
    setlocale(LC_ALL, "Rus");
    int N, k;
    cout << "Введите количество элементов" << endl;
cin >> N;
    vector <int> v(N);   
    cout << "Введите элементы" << endl;
    for (int i = 0; i < N; i++)  
    {
        cin >> v[i];                    
    }
    cout << "Значения второго вектора " << endl;
    for (int i = 0; i < N; i++) {
        cout << v[i] << " ";
    }
    cout << endl<< "какому числу должно быть кратное? k= " << endl;
    cin >> k;
    double sum = 0;
    int kol = 0;
    for (int i = 0; i <N; i++)
    {
        if (v[i]%k == 0) {
            sum += v[i];
            kol += 1;
        }
    }
    cout << sum / kol << endl;
    cout << "Максимум " << *max_element(v.begin(), v.end()) << endl;
    cout << "Mинимум: " << *min_element(v.begin(), v.end()) << endl;
    _getch();
return 0;
}

Остановился на 3 предложении. Собственно вопросы: 1) *min_element(v.begin(), v.end()) - обязательно использует разыменование? Смотрел примеры - не везде используется. 2) Как подступиться к 3 заданию (предложению)? Правильно я понял, что, например, в copy нельзя запихнуть цикл, а только методы?; 3) Если бы я использовал диапазон, где первый элемент указала минимальный, а последний максимальный, то работал бы он, если они не в том бы порядке расположены были? К примеру, в copy указано с мин до макс, а на деле макс будет раньше минимального.

Спасибо!

Answer 1

*min_element(v.begin(), v.end()) - обязательно использует разыменование?

min_element возвращает итератор. Разыменовывание нужно, если вы хотите получить значение, лежащее по этому итератору. Если вам нужен сам итератор, то оно, очевидно, не нужно.

"Если первый отрицательный элемент имеет четный индекс, то поменять местами части массива относительно этого элемента."

Как подступиться к 3 заданию (предложению)? Правильно я понял, что, например, в copy нельзя запихнуть цикл, а только методы?

Не понимаю вопрос. Во-первых, std::copy сам проходит с помощью цикла по всем элементам диапазона. Зачем еще один (видимо вложенный) цикл? Во-вторых, что мешает поместить цикл в функцию, которую вы передаете в std::copy?

Я бы создал еще один вектор, скопировал в него две половинки массива через std::copy(..., std::back_inserter(new_vector)), и заменил старый вектор на новый. Это проще всего.

3) Если бы я использовал диапазон, где первый элемент указала минимальный, а последний максимальный, то работал бы он, если они не в том бы порядке расположены были? К примеру, в copy указано с мин до макс, а на деле макс будет раньше минимального.

Это бы не сработало. Стандартные функции, принимающие пару итераторов, требуют, чтобы первый был именно началом диапазона, а второй - концом.

Нужно использовать что-то вроде

if (начало > конец)
    std::swap(начало, конец);
READ ALSO
Найти и заменить в строке заданное слово [закрыт]

Найти и заменить в строке заданное слово [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

113
std::string operator[]

std::string operator[]

Пробую запустить такой код

152
Два socket в одном потоке

Два socket в одном потоке

Пишу сервер на qtВопрос такой, могу ли я по очереди проинициализировать два socket и использовать их вместе

108
Как описать деструктор?

Как описать деструктор?

Есть класс List и класс NodeКак я не пытался описать деструкторы, методы del_first и del_last работают некорректно

99