Check duplication for my function

the work i done so far for it
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
#include <iostream>
#include <string>

using namespace std;

template< class T >
class Set{
private:
	T *type;
	int size;
	int current;
public:
	Set();
	Set(int);

	void add(T object);
	bool remove( T object );

	class iterator;
	friend class iterator;

	class iterator{
		Set & set;
		int index;

		iterator( Set & s ) : set(s) , index(0){}
		//To create the " end sentinel " iterator:
		iterator( Set & s, bool ): set(s), index( s.current ){}

		iterator begin(){ return iterator(*this); }
		//To create the "end sentinel" iterator:
	};
};

template< class T >
Set<T>::Set(){
	size = 5;//default size for set
	current = 0;
	type = new T[size];
}

template< class T >
Set<T>::Set( int s ){
	size = s;//default size for set
	current = 0;
	type = new T[size];
}

template< class T >
void Set<T>::add( T object ){
	//should check duplication before adding new item to set

	//if newitem without causing duplication , add into type
	//possible try to check type as well. if different type, raise exception error
	if( current < size )
		type[current++] = object;
	else
		cout << "List is full...." << endl;
}

template< class T >
bool remove( T object ){

	bool isDeleted = false;
	
	//loop through the list to search the object

	//if found then remove the item and reduce current value
	//possible try to shift the

	return isDeleted;
}

int main(){

	string list[] = {"Lim" , "Tan" , "Lee" , "Thor" , "Adrian" ,"Henry" , "Zachary" , "Michael" , "Ryan" , "Michelle"};

	Set<string>names(10);

	for( int i = 0 ; i < 10 ; i++ ){
		names.add("Lee");
	}
	//Set::iterator
	set<string>::iterator myIterator;


	for( int i = 0 ; i < 10 ; i++ ){
		cout << list[i] << endl;
	}

	system( "pause" );
	return 0;
}


for line 51 to 54 . how should i declare them? some senior give me advise for my linear search but i not really get it how to put inside my code..
Standard algorithm std::find performs the linear search. It is simple to write it applied to your container

int i = 0;
while ( ( i < current ) && !( type[i] == object ) ) i++;

if ( i == currrent ) type[currrent++] = object;

Type T has to have the comparision operator.
so it's same to loop to search the object with using while loop?
with similar to this code?
1
2
3
4
5
6
7
8
9
10
int i = 0;
bool found = 0;//Initialize false
for( int i = 0 ; i < current ; i++){
    if( type[i] == object )
          found = true;
    if( found == true )
         type[i-1] = object;
         current--;
    }
}


isn't true for my concept for line 66 to 69?
isn't correct?
I have not understood why you do not want to use my code. As for your code it 1) contains a bug 2) looks tot very well.:)
are you mean that line 66 to 69 & line 51 to 54 also same code concept with yours?
Since your approach is close to the std container you may want to use functions from there:

http://www.cplusplus.com/reference/algorithm/find/
http://www.cplusplus.com/reference/algorithm/remove/


Look at the examples. They are very close to your needs

Using find in your case would be:
1
2
3
4
5
6
7
8
9
void Set<T>::add( T object ){

T *p = std::find(type, type + current, object);
if((p == (type + size)) && (current < size))
{
  type[current] = object;
  ++current;
}
}
That is if you want to use the std lib (which is recommended)

Your remove functions is supposed to look something like this:
1
2
3
4
5
6
7
8
9
10
11
12
int i = 0;
bool found = false;//Initialize false
for( int i = 0 ; i < current ; i++){
    found = ( type[i] == object );
    if(found)
    {
        --current;
        type[i] = type[current];
        break;
    }
    }
}
Last edited on
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
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

template< class T >
class Set{
private:
	T *type;
	int size;
	int current;
public:
	Set();
	Set(int);

	void add(T object);
	bool remove( T object );

	class iterator;
	friend class iterator;

	class iterator{
		Set & set;
		int index;

		iterator( Set & s ) : set(s) , index(0){}
		//To create the " end sentinel " iterator:
		iterator( Set & s, bool ): set(s), index( s.current ){}

		iterator begin(){ return iterator(*this); }
		//To create the "end sentinel" iterator:
	};
};

template< class T >
Set<T>::Set(){
	size = 5;//default size for set
	current = 0;
	type = new T[size];
}

template< class T >
Set<T>::Set( int s ){
	size = s;//default size for set
	current = 0;
	type = new T[size];
}

template< class T >
void Set<T>::add( T object ){
	//should check duplication before adding new item to set
	int i = 0;
	T *p = find(type, type + current, object);
	if((p == (type + size)) && (current < size)){
	  type[current] = object;
	  ++current;
	}
	//if newitem without causing duplication , add into type
	
	//possible try to check type as well. if different type, raise exception error
	if( current < size )
		type[current++] = object;
	else
		cout << "List is full...." << endl;
}

template< class T >
bool remove( T object ){
	
	//loop through the list to search the object
	int i = 0;
	bool found = false;//Initialize false
	for( ; i < current ; i++){
		found = ( type[i] == object );
		if(found){
			--current;
			type[i] = type[current];
			break;
		}
    }
	//if found then remove the item and reduce current value
	//possible try to shift the

	return found;
}

int main(){

	string list[] = {"Lim" , "Tan" , "Lee" , "Thor" , "Adrian" ,"Henry" , "Zachary" , "Michael" , "Ryan" , "Michelle"};

	Set<string>names(10);

	for( int i = 0 ; i < 10 ; i++ ){
		names.add("Lee");
	}
	//Set::iterator
	//Set::iterator
	Set<string>::iterator myIterator( Set<string> , string );


	for( int i = 0 ; i < 10 ; i++ ){
		cout << list[i] << endl;
	}

	system( "pause" );
	return 0;
}


It's not working..
Last edited on
Your iterator needs an default constructor. But you cannot leave Set & set uninitialzed (you must provide an object). So use a pointer instead: Set * set. The iterator would look like this: iterator( Set * s = NULL) : set(s) , index(0){}

NULL is at the same time the indicator that the end is passed. begin() should not be a member of iterator but of Set<...> (returning the iterator)


Btw. Do not copy headlessly the code I provide. Does it work? Did you check that.

The current remove( T object ) does not shift while

http://www.cplusplus.com/reference/algorithm/remove/

does
Topic archived. No new replies allowed.