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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
OMAAGAAD
15 / 15 / 3
Регистрация: 24.09.2010
Сообщений: 45
13.05.2011, 08:59     Работа с STL. Поменять vector на list #1
Программа должна быть написана так, чтобы достаточно было заменить в
одном месте 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();
}
все
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2011, 08:59     Работа с STL. Поменять vector на list
Посмотрите здесь:

C++ STL vector,list
C++ vector STL
C++ Работа с STL list
Задача по контейнерам stl vector и list C++
C++ STL vector iterator
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
13.05.2011, 10:22     Работа с STL. Поменять vector на list #2
Функция sort для списка не работает. Там надо пользоваться методом sort. Так что как ни крути, одним typedef'ом не обойдешься.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.05.2011, 12:34     Работа с STL. Поменять vector на list #3
Для сортировки перегрузи две шаблонные функции, в которые передавать ссылку на контейнер. Для вектора будешь внутри вызывать функцию сортировки, для списка - метод.
Тогда обойдёшься одним typedef'ом.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
13.05.2011, 14:21     Работа с STL. Поменять vector на list #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;
}
Для листа метод, для остальных контейнеров функция.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.05.2011, 14:39     Работа с STL. Поменять vector на list #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();
}
 
// Прочие типы контейнеров
...
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
13.05.2011, 14:50     Работа с STL. Поменять vector на list #6
Deviaphan, вы правы. Я какой-то бред написал.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.05.2011, 14:59     Работа с STL. Поменять vector на list #7
Цитата Сообщение от gooseim Посмотреть сообщение
Я какой-то бред написал.
В ряде случаев этот "бред" даже более удобным будет.)
lemegeton
 Аватар для lemegeton
2911 / 1340 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.05.2011, 22:05     Работа с STL. Поменять vector на list #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;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.05.2011, 01:13     Работа с STL. Поменять vector на list #9
C++
1
2
3
4
template <typename T>
struct Multiplication {
  T operator()(T init, T next) { return init * next; }
};
Кхм. Я может туплю. Но на кой? Чем std::multiplies не угодил?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2011, 13:24     Работа с STL. Поменять vector на list
Еще ссылки по теме:

C++ Работа с двунаправленым списком. STL <list>
C++ Работа с STL vector
Работа с STL list + пропись List.h C++

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2911 / 1340 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
14.05.2011, 13:24     Работа с STL. Поменять vector на list #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Чем std::multiplies не угодил?
Хз, в чем была моя логика. Наверно, не хотелось инклудить functional.
Yandex
Объявления
14.05.2011, 13:24     Работа с STL. Поменять vector на list
Ответ Создать тему
Опции темы

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