Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
OMAAGAAD
15 / 15 / 3
Регистрация: 24.09.2010
Сообщений: 45
#1

Работа с STL. Поменять vector на list - C++

13.05.2011, 08:59. Просмотров 1174. Ответов 9
Метки нет (Все метки)

Программа должна быть написана так, чтобы достаточно было заменить в
одном месте vector на list и приложение делало все то же самое. Если
что-то не получится -- надо будет это обосновать.
Вот что получилось у меня, но проблемы в вышесказанном. Не пойму как это реализовать
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
#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
int main()
{
    list <int> c;
    int i=0,b=0;
    list<int>::iterator p;
    while(1)
    {
        scanf ("%d", &i);
        if (i==100500) break;
        c.push_back(i);
    }
    cout << "size = " << c.size() << "\n";
    //sort(c.begin(),c.end());
    for (p=c.begin();p!=c.end();p++)
        cout << *p << " ";
    cout<<endl;
    list <int>:: iterator minimum = min_element(c.begin(),c.end());
    cout<<"minimum="<<*minimum<<endl;
    list <int>:: iterator maximum = max_element(c.begin(),c.end());
    cout<<"maximum="<<*maximum<<endl;
    for(p=c.begin() ; p!=c.end() ; p++)
        b+=*p;
    cout<<"arithmetric average="<<b/c.size()<<endl;
    b=1;
    for(p=c.begin() ; p!=c.end() ; p++)
        {
            b*=(*p);
            if(b<0) 
            {
                b=0;
                cout<<"There is no geometric average"<<endl;
                break;
            }
        }
    cout<<"geometric average="<<pow(b,1.0/c.size())<<endl;
    if (c.size()%2==0)
        cout<<"Length is even"<<endl;
    else
    {
        p=c.begin();
        for(int i=0;i<c.size()/2;i++)
            p++;
            b=*p;
        cout<<"middle:"<<b<<endl;
    }
    c.clear();
}
Добавлено через 6 часов 58 минут
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
#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
typedef vector <int> array;
int main()
{
    array c;
    int i=0,b=0;
    array::iterator p;
    while(1)
    {
        cin>>i;
        if (i==100500) break;
        c.push_back(i);
    }
    cout << "size = " << c.size() << "\n";
    sort(c.begin(),c.end());
    for (p=c.begin();p!=c.end();p++)
        cout << *p << " ";
    cout<<endl;
    array:: iterator minimum = min_element(c.begin(),c.end());
    cout<<"minimum="<<*minimum<<endl;
    array:: iterator maximum = max_element(c.begin(),c.end());
    cout<<"maximum="<<*maximum<<endl;
    for(p=c.begin() ; p!=c.end() ; p++)
        b+=*p;
    cout<<"arithmetric average="<<b/c.size()<<endl;
    b=1;
    for(p=c.begin() ; p!=c.end() ; p++)
        {
            b*=(*p);
            if(b<0) 
            {
                b=0;
                cout<<"There is no geometric average,because of definition"<<endl;
                break;
            }
        }
    cout<<"geometric average="<<pow(b,1.0/c.size())<<endl;
    if (c.size()%2==0)
        cout<<"Length is even"<<endl;
    else
    {
        p=c.begin();
        for(int i=0;i<c.size()/2;i++)
            p++;
            b=*p;
        cout<<"middle:"<<b<<endl;
    }
    c.clear();
}
все
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2011, 08:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с STL. Поменять vector на list (C++):

STL vector,list - C++
У меня 2 вопроса: 1) можете рассказать,как подробно работает reverse_iterator?Создал вектор,хочу его распечатать в обратном порядке...

Задача по контейнерам stl vector и list - C++
Дан сортированный по убыванию массив int'ов размером 100 элементов. Значение начального максимального элемента a, минимального b. На вход...

Работа с STL list + пропись List.h - C++
Здравствуйте! Помогите, пожалуйста, разобраться с STL list. Нужно сделать программу в которой будет содержаться класс Student, прописать...

Работа с STL vector - C++
Добрый день! Прошу объяснить следующие моменты связанные с &lt;vector&gt; (почему ругается студия, откуда берутся такие результаты) и дать...

Работа с STL <list> - C++
В общем, есть текст, программа выделяет в тексте последовательность введённую с клавиатуры(выделяет скобками {}) Например выделить...

Работа с STL list - C++
Есть некий каталог с 3 переменными (string,string,int), который нужно хранить в list Как я понимаю есть 2 решения хранения. 1....

9
gooseim
Эксперт С++
509 / 413 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
13.05.2011, 10:22 #2
Функция sort для списка не работает. Там надо пользоваться методом sort. Так что как ни крути, одним typedef'ом не обойдешься.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.05.2011, 12:34 #3
Для сортировки перегрузи две шаблонные функции, в которые передавать ссылку на контейнер. Для вектора будешь внутри вызывать функцию сортировки, для списка - метод.
Тогда обойдёшься одним typedef'ом.
1
gooseim
Эксперт С++
509 / 413 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
13.05.2011, 14:21 #4
Deviaphan, хорошее решение.

OMAAGAAD, что то вроде такого:
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
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
 
typedef int data_t;
typedef std::list<data_t> array;
 
template<class Cont>
void sort(Cont& v)
{
   std::sort(v.begin(), v.end());
}
template<>
void sort(std::list<data_t>& v)
{
   v.sort();
}
 
int main()
{
  data_t data[]={4, 2, 3, 5, 1};
  array arr(data, data+sizeof(data)/sizeof(data_t));
  sort(arr);
  for(array::const_iterator p=arr.begin() ; p!=arr.end() ; ++p)
     std::cout<<*p<<std::endl;
}
Для листа метод, для остальных контейнеров функция.
2
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.05.2011, 14:39 #5
Цитата Сообщение от gooseim Посмотреть сообщение
для остальных контейнеров функция
Ещё нужна перегрузка для std::map, которая вообще ничего не делает. И для стека с генерацией ошибки.
Но я имел в виду нечто вроде этого, но суть и так ясна:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class T>
void sort( std::vector<T> & v)
{
   std::sort(v.begin(), v.end());
}
 
template<class T>
void sort(std::list<T>& v)
{
   v.sort();
}
 
// Прочие типы контейнеров
...
2
gooseim
Эксперт С++
509 / 413 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
13.05.2011, 14:50 #6
Deviaphan, вы правы. Я какой-то бред написал.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.05.2011, 14:59 #7
Цитата Сообщение от gooseim Посмотреть сообщение
Я какой-то бред написал.
В ряде случаев этот "бред" даже более удобным будет.)
1
lemegeton
2927 / 1356 / 136
Регистрация: 29.11.2010
Сообщений: 2,725
13.05.2011, 22:05 #8
Только для vector и list. Для set надо по-другому.
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
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
#include <algorithm>
#include <numeric>
#include <iomanip>
 
typedef std::list<int> container;
 
template <typename T>
struct Random {
  T operator()() { return rand() % 10; }
};
 
template <typename T>
struct Multiplication {
  T operator()(T init, T next) { return init * next; }
};
 
template <class Container>
void sort(Container &container) {
  std::sort(container.begin(), container.end());
}
 
template <typename ValueType>
void sort(std::list<ValueType> &list) {
  list.sort();
}
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
  container elements(5 + rand() % 3);
  std::generate(elements.begin(), elements.end(), Random<int>());
  sort(elements);
  std::copy(elements.begin(), elements.end(),
            std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;
  std::cout << "Minimum: " << *std::min_element(elements.begin(),
               elements.end()) << std::endl
            << "Maximum: " << *std::max_element(elements.begin(),
               elements.end()) << std::endl            
            << "Arithmetic average: " << std::accumulate(elements.begin(),
                elements.end(), 0) / elements.size() << std::endl
            << "Geometric average: " << std::fixed
            << pow(std::accumulate(elements.begin(), elements.end(), 1,
               Multiplication<int>()), 1. / elements.size()) << std::endl;
  if (elements.size() % 2 == 0) {
    std::cout << "Length is even. Sorry." << std::endl;
  } else {
    container::iterator middle = elements.begin();
    std::advance(middle, elements.size() / 2);
    std::cout << "Middle element: "<< *middle
              << std::endl;
  }
  return 0;
}
1
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
14.05.2011, 01:13 #9
C++
1
2
3
4
template <typename T>
struct Multiplication {
  T operator()(T init, T next) { return init * next; }
};
Кхм. Я может туплю. Но на кой? Чем std::multiplies не угодил?
2
lemegeton
2927 / 1356 / 136
Регистрация: 29.11.2010
Сообщений: 2,725
14.05.2011, 13:24 #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Чем std::multiplies не угодил?
Хз, в чем была моя логика. Наверно, не хотелось инклудить functional.
0
14.05.2011, 13:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2011, 13:24
Привет! Вот еще темы с ответами:

Работа с векторами без использования STL и библиотеки <vector> - C++
Здравствуйте Уважаемые формучане. Подскажите пожалуйста, есть ли смысл писать свой собственный класс Vector если из него всё равно будет...

Работа с двунаправленым списком. STL <list> - C++
Помогите пожалуста найти ошибку.. 3) Даны натуральное число n, действительные числа x1,x2,....,xn . Вычислить: x1*xn+x2*xn-1+...+xn*x1...

vector STL - C++
class data { public: char path; char net; char metric; int number; // для укаания строки таблици }; class vertex

STL vector iterator - C++
есть список в списке... ..точнее: vector &lt;Class1*&gt; mapClass1; а уже в Class1 определён вектор vector &lt;Class2*&gt; mapClass2; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.