Форум программистов, компьютерный форум CyberForum.ru

Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки - C++

Восстановить пароль Регистрация
 
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 02:56     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #1
вот задача

В одномерном массиве из n элементов вычислить:
1) сумму элементов с нечетными индексами
1) сумму элементов между первым и последним отрицательным элементами

ее нужно реализовать при помощи алгоритмов из библиотеки <algorithm>. первое, на чем я застопорилась, это какие алгоритмы здесь вообще можно применить? я не знаю, как решить эти задачи при помощи алгоритмов, про которые я прочитала... существуют ли алгоритмы для суммы элементов по определенному критерию?

с суммой между отрицательными еще как-то можно разобраться при помощи find_if, наверно.
вот начальный кусочек кода)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool find_negative(int val1)//Функция сравнения
{
    return val1<0;
}
int main()
{
    int a[5]={-1,2,-5,3,4};
    vector<int> array(a,a+5);
    cout<<*find_if(array.begin(),array.end(),find_negative);
    system("pause");
    return(0);
};
подскажите пожалуйста, а какие алгоритмы еще можно использовать?

Добавлено через 1 час 15 минут
и почему, если писать так, то не работает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include<algorithm>
#include<vector>
#include <numeric>
using namespace std;
bool find_negative(int val1)
{
    return val1<0;
}
 
int main()
{
    int a[5]={-1,2,-5,3,4};
    vector<int> array(a,a+5);
    vector<int>::iterator fotr;
    vector<int>::reverse_iterator lotr;
     fotr=find_if(array.begin(),array.end(),find_negative);
     lotr=find_if(array.rbegin(),array.rend(),find_negative);
     cout<<accumulate(fotr,lotr,0);
            system("pause");
     return(0);
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2013, 02:56     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки
Посмотрите здесь:

C++ Работа с одномерным массивом.
работа с одномерным массивом C++
работа с одномерным массивом, динамическое выделение памяти C++
C++ Работа с одномерным массивом
C++ Работа с одномерным целочисленным массивом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
20.05.2013, 03:07     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #2
1.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v = {-1, 2, -5, 3, 4};
    int sum = 0;
    for (int i=1; i < v.isze(); i+=2)
        sum += v[i];
    std::cout << sum << std::endl;
}
Или здесь надо всенепременно поизвращаться с алгоритмом accumulate и передачей переменной из внешнего блока, отвечающей за индекс и инкрементирующейся при каждом обходе? Или for_each прилепить ненужный?
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 03:17  [ТС]     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #3
MrGluck, поизвращаться надо( смысл задания именно в этом. Так-то мы такие задачи еще в школе через обычные массивы решали, я знаю, как это делается без всяких библиотек. А accumulate - это единственное, что я нарыла для суммирования, но оно из другой библиотеки...
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
20.05.2013, 03:25     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #4
2.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <numeric>
 
int main()
{
    std::vector<int> v = {-1, 2, -5, 3, 4};
    std::vector<int>::iterator it1 = std::find_if(v.begin(), v.end(),
        [](const int x) { return x < 0; } );
    std::vector<int>::reverse_iterator it2 = std::find_if(v.rbegin(), v.rend(),
        [](const int x) { return x < 0; } );
    std::cout << std::accumulate(++it1, v.begin() + std::distance(++it2, v.rend()), 0);
}
Надо помнить, что нельзя пихать в один алгоритм iterator и reverse_iterator.

Добавлено через 3 минуты
1 задача с всенепременным применением алгоритма из хедера algorithm.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <algorithm>
 
int main()
{
    std::vector<int> v = {-1, 2, -5, 3, 4};
    bool evenIndex = true;
    int sum = 0;
    std::for_each(v.begin(), v.end(), [&evenIndex, &sum](const int x)
        { if (!evenIndex) sum += x; evenIndex = !evenIndex; } );
    std::cout << sum << std::endl;
}
Можно еще copy за уши притянуть с копированием в поток ostream через итераторы.
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 03:47  [ТС]     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #5
Вау! Спасибо большое за помощь! Я думаю, этого будет достаточно) а не могли бы вы объяснить, что это за конструкция [ ](const int x) ?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
20.05.2013, 03:52     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #6
migtymasha, лямбда-функция (из стандарта С++11)
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 14:07  [ТС]     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #7
MrGluck, а ваш код работал?

Добавлено через 26 минут
у меня компилятор ругается на синтаксис в лямбде-функции
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.05.2013, 14:09     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #8
Цитата Сообщение от migtymasha Посмотреть сообщение
у меня компилятор ругается на синтаксис в лямбде-функции
Вероятно не поддерживает. Какой компилятор? Проверить код можно онлайн на ideone.com.
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 14:16  [ТС]     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #9
Tulosba, пишу в Visual Studio 2008
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
20.05.2013, 14:19     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #10
migtymasha, ваш компилятор не поддерживает С++11 и соотв. лямбда-функций.

Пробуйте переписать через функторы, хотя я даже не знаю, как замыкания организовать, кроме как через глобальные переменные, что не есть хорошо. Если очень хочется - можно из буста взять л-функции.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.05.2013, 14:22     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #11
Цитата Сообщение от migtymasha Посмотреть сообщение
пишу в Visual Studio 2008
Однозначно не поддерживает С++11. Даже VS2012 не в полном объеме поддерживает. Поэтому лямбды нужно заменить на обычные функции или функциональные объекты.

Добавлено через 1 минуту
Цитата Сообщение от MrGluck Посмотреть сообщение
как замыкания организовать, кроме как через глобальные переменные, что не есть хорошо.
MrGluck, так можно же хранить состояние в функторе.
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 15:16  [ТС]     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #12
MrGluck, единственное, на что меня хватило
C++
1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
int su=0; bool evenIndex=true;
int sum(int val)
{
    
    if (!evenIndex)
    {
        su += val;
        evenIndex = !evenIndex;
    };
    return su;
};
это неправильно, конечно) ошибок не выдает, но в ответе какое-то 16-ричное число...

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

и спасибо за помощь, сумму между отрицательными я нашла без лямбды-функции, но с вашими исправлениями в accumulate.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.05.2013, 16:01     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #13
Насчет хранения состояния в функторе, имелось в виду следующее:
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
#include <iostream>
#include <vector>
#include <algorithm>
 
class EvenAccumulator
{
public:
    EvenAccumulator( int& sum ) : sum(sum), even(true) { }
    void operator()(int value)
    {
        if( !even )
        {
            sum += value;
        }
        even = !even;
    }
private:
    bool even;
    int& sum;
};
 
int main()
{
    int a[5]={-1,2,-5,3,4};
    std::vector<int> v(a, a+5);
    int sum = 0;
    EvenAccumulator acc( sum );
    std::for_each( v.begin(), v.end(), acc );
    std::cout << sum << std::endl;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2013, 17:59     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки
Еще ссылки по теме:

Работа с одномерным вещественным массивом C++
C++ Работа с одномерным массивом
C++ Работа с одномерным массивом

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 17:59  [ТС]     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки #14
Tulosba, !!! работает! спасибо большое и вам, я даже поняла, что вы написали)
Yandex
Объявления
20.05.2013, 17:59     Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки
Ответ Создать тему
Опции темы

Текущее время: 08:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru