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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
xadjek
36 / 36 / 4
Регистрация: 05.06.2011
Сообщений: 306
#1

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

06.06.2011, 19:01. Просмотров 2180. Ответов 7
Метки нет (Все метки)

Здравствуйте. Нужна помощь в написании лабораторной работы
задание
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;
	  };
	   };
буду весьма благодарен в оказании любой помощи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2011, 19:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Контейнеры и итераторы (C++):

Контейнеры и итераторы - C++
Тема: иерархия объектов и группа. Итераторы. Задание: Имена всех монархов на заданном континенте.

Двусвязный список контейнеры и итераторы - C++
#include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;list&gt; using namespace std; class List { private: int...

STL. Итераторы и последовательные контейнеры - C++
Немогу решить эти задачки: 1 Написать экземпляр класса queue на основе элементов типа string. 2.Написаты программу, которая использует...

Итераторы и обратные итераторы - C++
У вектора есть два типа итераторов, обычные и обратные итераторы произвольного доступа... Обычные реализовал, осталось обратные. Решил...

Итераторы С++ - C++
Помогите, пожалуйста, надо написать две программы Задача 1 Напишите программу, использующую итераторы при чтении последовательности...

итераторы - C++
ребят помогите плиз vector&lt;double&gt;::iterator t = matrix.begin(); vector&lt;double&gt;::iterator t1 = matrix.end(); for(;t&lt;t1;t++) ...

7
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
07.06.2011, 01:22 #2
Посмотрите вот этот топик: Списки, стеки, очереди
0
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;
т.е. то и есть та программа из шапки, но уже которую я начал писать потихоньку но пока неудачно(
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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, так что хватит и еще останется).
0
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 карт даже обьявив другой массив мы не можем
причина использования вектора в виде контйнера обуславливается тем что по варианту задания так надо, но если реализовать через множество(выполнить чужой вариант) думаю проблем с преподом не будет все равно...
0
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? т.к. после действия алгоритма контейнер(содержимое) то изменяется а мне нужен изначальное содержимое перед каждым новым алгоритмом...
0
sandye51
программист С++
685 / 587 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
12.06.2011, 22:18 #7
Оо передавай в отдельные функции этот контейнер по значению. Тогда он будет один и никаких модификаций.
а каждая фукнция - демонстрация какого-либо алгоритма
0
xadjek
36 / 36 / 4
Регистрация: 05.06.2011
Сообщений: 306
12.06.2011, 22:26  [ТС] #8
а можно на данном примере показать? а то я что-то не сильно понял...
0
12.06.2011, 22:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2011, 22:26
Привет! Вот еще темы с ответами:

Итераторы - C++
От какого класса наследуются итераторы в STL? Например я создаю класс и для него нужен собственный итератор, совместимый с STL (более...

Итераторы - C++
Не могу въехать как работают итераторы, литература-форумы не помогли, увы. На 26й строке то, что не могу осилить. Прохожу по стеку...

Итераторы в C++ - C++
Помогите плз решить 2 задачи Задача 1 Напишите программу, использующую итераторы при чтении последовательности строк со стандартного...

Итераторы - C++
Добрый день! Начал изучать классы в C++ параллельно с итераторами. Решил сделать простенькую программу, которая создаёт список классов....


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

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

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