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

Контейнеры и итераторы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
xadjek
 Аватар для xadjek
36 / 36 / 4
Регистрация: 05.06.2011
Сообщений: 306
06.06.2011, 19:01     Контейнеры и итераторы #1
Здравствуйте. Нужна помощь в написании лабораторной работы
задание
1. Контейнеры. Создать контейнер, добавить в него следующий обьект: расклад карт для 1 руки (12 карт 4 мастей от 1 до Т)
Протестировать методы контейнера, скопировать его элементы в другой контейнер.

2. Итераторы. Протестировать работу итераторов различного типа., например, при вводе
и просмотре всех элементов контейнера, добавлении, поиске, удалении и пр.

3. Алгоритмы. Протестировать по 2 алгоритма каждой из 4 групп стандартной библиотеки алгоритмов. Указать, где используются стандартные объекты-функции (взять по 2 согласно вариантам). Обязательно использовать функциональный объект из п 1.
Контейнер-vector
обьекты функции: plus
Немодифицирующие алгоритмы:mismatch, count
Модифицирующие алгоритмы: remove_copy_if, rotate
Алгоритмы, связанные с сортировкой: sort_heap
Численные алгоритмы: adjacent_difference
из всего имеется свой написанный класс(сам расклад карт)
Код
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include<vector>
#include<algorithm>
#include<iterator>
#include<set>
using namespace std;
class Rasclad
{
private:
	string S[2][6];
	int N;
public:
	Rasclad() {};
	~Rasclad() {};

	int Find(string str)
		 {
          for(int i=0;i<N;i++)
           {
            if(!strcmp(S[i],str))
            return i;
           }
           return -1;
         }
	   bool Add(char*str)
	      {
           if(N<20)
            {
            strcpy(S[N],str);
            N++;
            return true;
           }
          else return false;
         }
	   bool Del(char*str)
		{
          int k=Find(str);
	      cout<<k<<endl;
          if(k>=0)
           {
           for(int i=k+1;i<N;i++)
            strcpy(S[i-1],S[i]);
           N--;
          return true;
           }
          return false;
         }
	   void View()
         {
          for(int i=0;i<N;i++)
          cout<<S[i]<<endl;
         }
	   bool Filter()
		 {
		  int k=0;
		   for(int i=0;i<N;i++)
		   {
			 if((atoi(S[i])%2)==1)//преобразует строку, адресуемую параметром str, в значение типа int
			 {
			  cout<<S[i]<<endl;
			  k++;
			 return false;
			 }
			 else return true; 
		  }
	   int Sort(char*str);
		 { 
		   char*str;
		   for ( int i=0;i<N-1;i++)
		   for (int j=N-1;j>i;j--)
            { 
			 if(strlen(S[j])>strlen(S[j-1]))//возвращает в  байтах  длину  строки  string
				
				strcpy(str,S[j]);
				strcpy(S[j],S[j-1]);
				strcpy(S[j-1],str);
		    }
	     }

		  bool operator==(Rasclad T, Rasclad T2)
	  {if(N==T.N)
	  return true;
	  if(!N==T.N)
	  return false; };
	   bool operator<(Set T)
	 {
	  if(N<T.N)
	  return true;
	  else false;
	  };
	  
	  
	  char* operator[](int i)
	  { 
       return S[i];
	  };
	  
	  friend Set operator<<(Set,char*str)
	  {cout<<str<<"";};
	  bool operator>(Set T)
	 {
	  if(N>T.N)
	  return true;
	  else false;
	  };
	   };
буду весьма благодарен в оказании любой помощи
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2011, 19:01     Контейнеры и итераторы
Посмотрите здесь:

Итераторы и обратные итераторы C++
Итераторы в C++ C++
Итераторы С++ C++
Итераторы C++
C++ Итераторы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
07.06.2011, 01:22     Контейнеры и итераторы #2
Посмотрите вот этот топик: Списки, стеки, очереди
xadjek
 Аватар для xadjek
36 / 36 / 4
Регистрация: 05.06.2011
Сообщений: 306
08.06.2011, 00:55  [ТС]     Контейнеры и итераторы #3
Возник еще один вопрос-написал код, но он не компилируется т.к. выдается куча ошибок которые я не могу понять как исправить
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
 
class Rasclad
{
char* S[2][6];
int N, M;
public:
Rasclad() {};
~Rasclad() {};
int Find(char* str)
{
for(int i=0;i<2;i++)
for(int j=0;j<6;j++)
{
if(!strcmp(S[i][j],str))
{return i;}
else {return -1;}
}
 
}
bool Add(char*str)
{
if(N<6)
{
strcpy(S[N][M],str);
N++;
M++;
return true;
}
else return false;
}
bool Del(char*str)
{int j;
int k=Find(str);
cout<<k<<endl;
if(k>=0)
{
for(int i=k+1;i<2;i++)
for(int j=k+1;j<6;j++)
strcpy(S[i-1][j-1],S[i][j]);
N--;
M--;
return true;
}
return false;
}
void View()
{
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
 
cout<<S[i][j]<<endl;
}
 
bool operator==(Rasclad T)
{
bool localResult = true;
bool result = true;
{for(int i=0;i<2;i++)
for(int j=0;j<6;j++)
{ char* tmp=T.getRasclad(i,j);
localResult = strcmp(tmp,S);
if(!localResult)
result = localResult;
}
}
}
bool operator>(Rasclad T)
{
if(N>T.N)
return true;
else 
{return false;}
}
char* getRasclad(int i,int j)
{
return S[i][j];
}
friend ostream &operator<<(ostream &stream, Rasclad obj)
{ for(int i=0;i<2;i++)
for(int j=0;j<6;j++)
{stream<<obj[i][j];}
}
};
 
int main()
{
vector<Rasclad>cont;//создание вектора нулевой длинны
vector<Rasclad>cont2;
unsigned int i,j;
cout<<"Container size"<<cont.size()<<endl;
vector<Rasclad>::iterator p=cont.begin();
for(i=0;i<2;i++)
{for(j=0;j<cont.size();j++)
{
Rasclad* tmp = new Rasclad();   
    cont.insert(p,tmp);
}
}
 
cont2.insert(cont.begin(),cont.end());
for(i=0;i<cont.size();i++)
{for(j=0;j<cont.size();j++);//отобрaжаем содержимое множества
cout<<cont[i][j]<<endl;
}
for(int i=0;i<cont.size();i++)
for(j=0;j<cont.size();j++)
cont[i][j]=cont[i][j]+cont2[i][j];//изменяем содержимое множества
cout<<"content doubled:\n"<<endl;
cout<<cont[i][j]<<endl;
 
char*s[2][6];
vector<Rasclad>::iterator p;
p= cont.begin();
while(p!=cont.end())
{
cout<<*p;
p++;
}
 
char*S[2][6];
vector<Rasclad>::iterator p=cont.begin();
p+=2;//указатель на 3-й элемент
cont.insert(p,4,S[1][3]);//вставляем 10 символов
cout<<"size of the vector after insert="<<cont.size()<<endl;
cout<<"content of the vector after insert:\n";
for(int i=0;i<cont.size();i++)
{for(int j=0;j<cont.size();j++)
{cout<<cont[i][j];}
}
p= cont.begin();
p+=2;
cont.erase(p,p+5);//удаление 5 элементов подряд
cout<<"size of the vector after insert"<<cont.size()<<endl;
т.е. то и есть та программа из шапки, но уже которую я начал писать потихоньку но пока неудачно(
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.06.2011, 12:15     Контейнеры и итераторы #4
Цитата Сообщение от xadjek Посмотреть сообщение
Создать контейнер,
Контейнер надо свой написать или использовать STL контейнер?

Цитата Сообщение от xadjek Посмотреть сообщение
12 карт 4 мастей от 1 до Т
Эээ... 2,3,4,5,6,7,8,9,10,В,Д,К,Т -- тринадцать (не 12) карт. Какую-то надо выбросить?

И дальше по заданию непонятно, где надо использовать свой самописный контейнер, а где -- STL контейнеры.

Если надо создать свой контейнер для хранения набора карт (выборка N из 52), я бы предложил создать контейнер-множество. Причем его совершенно не обязательно строить на базе дерева, это может быть просто массив из 7 байт, где каждый бит обозначает соответствующую карту. (7*8 = 56 бит, а карт всего 52, так что хватит и еще останется).
xadjek
 Аватар для xadjek
36 / 36 / 4
Регистрация: 05.06.2011
Сообщений: 306
08.06.2011, 15:57  [ТС]     Контейнеры и итераторы #5
Цитата Сообщение от lemegeton Посмотреть сообщение
Контейнер надо свой написать или использовать STL контейнер?


Эээ... 2,3,4,5,6,7,8,9,10,В,Д,К,Т -- тринадцать (не 12) карт. Какую-то надо выбросить?

И дальше по заданию непонятно, где надо использовать свой самописный контейнер, а где -- STL контейнеры.

Если надо создать свой контейнер для хранения набора карт (выборка N из 52), я бы предложил создать контейнер-множество. Причем его совершенно не обязательно строить на базе дерева, это может быть просто массив из 7 байт, где каждый бит обозначает соответствующую карту. (7*8 = 56 бит, а карт всего 52, так что хватит и еще останется).
1. надо использовать STL контейнер
причины использования 12 карт проста-там обьявлен массив 2х6, т.е. получить таким образом 13 карт даже обьявив другой массив мы не можем
причина использования вектора в виде контйнера обуславливается тем что по варианту задания так надо, но если реализовать через множество(выполнить чужой вариант) думаю проблем с преподом не будет все равно...
xadjek
 Аватар для xadjek
36 / 36 / 4
Регистрация: 05.06.2011
Сообщений: 306
12.06.2011, 22:07  [ТС]     Контейнеры и итераторы #6
в общем код почти дописан но возник такой вопрос, вот например идет работа с одним и тем же контейнером
C++
1
2
3
4
5
6
7
8
9
10
11
12
cout<<"Randomnaya sortirovka"<<endl;
random_shuffle(cont.begin(),cont.end());//рандомная сортировка, модифицирующий алгоритм #2
for_each(cont.begin(),cont.end(),show);
 
cout<<"sort_heap"<<endl;
sort_heap (cont.begin(),cont.end());//сортировка кучи #1
p= cont.begin();
while(p!=cont.end())
{
cout<<*p;
p++;
}
вот тут продемонстрировано 2 алгоритма работающих с контейнером cont
вопрос-нужно ли после каждого действия алгоритма писать return 0? т.к. после действия алгоритма контейнер(содержимое) то изменяется а мне нужен изначальное содержимое перед каждым новым алгоритмом...
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
12.06.2011, 22:18     Контейнеры и итераторы #7
Оо передавай в отдельные функции этот контейнер по значению. Тогда он будет один и никаких модификаций.
а каждая фукнция - демонстрация какого-либо алгоритма
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2011, 22:26     Контейнеры и итераторы
Еще ссылки по теме:

итераторы C++
Двусвязный список контейнеры и итераторы C++
C++ STL. Итераторы и последовательные контейнеры

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

Или воспользуйтесь поиском по форуму:
xadjek
 Аватар для xadjek
36 / 36 / 4
Регистрация: 05.06.2011
Сообщений: 306
12.06.2011, 22:26  [ТС]     Контейнеры и итераторы #8
а можно на данном примере показать? а то я что-то не сильно понял...
Yandex
Объявления
12.06.2011, 22:26     Контейнеры и итераторы
Ответ Создать тему
Опции темы

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