Question : Help me understand why one  code is better than the other.....

Both code #1 and code #2 achieves the same result.  I need help understanding why one may be better than the other.
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:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
CODE #1
#include <iomanip>
#include <iostream>
#include <string>
#include <sstream>
#include <set>
#include <vector>
#include <algorithm>

using namespace std;

struct StudentAttempt
{
   int distance;
   string studentName;
};

bool cmpAttempts(StudentAttempt left, StudentAttempt right) {
   if( left.distance < right.distance ) {
      return true;
   }
   else if( left.distance == right.distance ) {
      if( left.studentName < right.studentName ) {
         return true;
      }
      else
         return false;
   }
   else
      return false;
}

bool isDistEqual( StudentAttempt left, StudentAttempt right) {
   return ( left.distance == right.distance
      && left.studentName != right.studentName );
}

size_t printAllEqual(const vector<StudentAttempt>& v, const StudentAttempt& sa, stringstream& ss ) {

   vector<StudentAttempt>::const_iterator i = v.begin();
  size_t sz = 0;
  bool bFirst = true;

  while (i != v.end()) {

    if(isDistEqual(*i,sa)) {
    
      if (!bFirst) ss << ',';
      ss << i->studentName;
      ++sz;
    }

    ++i; 
    bFirst = false;
  }

  return sz;
}
 

int main() {

   StudentAttempt throwDist[] = {
      {50, "A"},      {22, "A"},      {16, "B"},      {44, "C"},
      {33, "D"},      {34, "E"},      {22, "F"},      {21, "G"},
      {49, "A"},      { 5, "B"},      { 2, "C"},      {22, "A"},
      {33, "B"},      {22, "C"},      {22, "D"},      {44, "E"},
   };

   set<int> handled;

   int len = sizeof( throwDist )/ sizeof( throwDist[0] );
   vector<StudentAttempt> dist(throwDist, throwDist + len);
   vector<StudentAttempt>::iterator it = dist.begin();

   sort( dist.begin(), dist.end(), cmpAttempts);
   //unique( dist.begin(), dist.end(), cmpDist);


   for( ; it != dist.end(); it++ ) {

      stringstream ss;

      pair<set<int>::iterator,bool> p = handled.insert(it->distance);

      if (!p.second) continue; // already handled

      if(0 < printAllEqual(dist,*it,ss)) 
        cout << setw(2) << (*it).distance 
           << " feet:  " << (*it).studentName << ss.str() << endl;
   }
}

CODE #2:
#include <iomanip>
#include <iostream>
#include <string>
#include <sstream>
#include <set>
#include <vector>
#include <algorithm>

using namespace std;

struct StudentAttempt
{
   int distance;
   string studentName;
};

 bool cmpAttempts(StudentAttempt left, StudentAttempt right) {
   if( left.distance < right.distance ) 
   {
      return true;
   }
   else if( left.distance == right.distance ) 
   {
      if( left.studentName < right.studentName ) 
	  {
         return true;
      }
      else
         return false;
   }
   else
      return false;
}

int main() {

   StudentAttempt throwDist[] = {
      {50, "A"},      {22, "A"},      {16, "B"},      {44, "C"},
      {33, "D"},      {34, "E"},      {22, "F"},      {21, "G"},
      {49, "A"},      { 5, "B"},      { 2, "C"},      {22, "A"},
      {33, "B"},      {22, "C"},      {22, "D"},      {44, "E"},
   };

   set<int> handled;

   int len = sizeof( throwDist )/ sizeof( throwDist[0] );
   vector<StudentAttempt> dist(throwDist, throwDist + len);
   vector<StudentAttempt>::iterator it = dist.begin();

   sort( dist.begin(), dist.end(), cmpAttempts);
   //unique( dist.begin(), dist.end(), cmpDist);

   int x;
  for( x=0; x < dist.size(); x++ ) 
   {
      stringstream ss;
      pair<set<int>::iterator,bool> p = handled.insert(dist[x].distance);
	  int z = 0;

      if (p.second)  
	  {
		  int y;

     	  for( y=0; y < dist.size(); y++ ) 
		  {
			  if( dist[x].distance == dist[y].distance && dist[x].studentName != dist[y].studentName)
				{
 					  ss << ',';
					  ss << dist[y].studentName;
					  z += 1;
				}
		  }
	 }
	if (z > 0)
	  {
	   cout << setw(2) << dist[x].distance << " feet: " << dist[x].studentName << ss.str() << endl;
	   z = 0;
	  }
   }
}

Answer : Help me understand why one  code is better than the other.....

For iterators... It may look not so at the first time, but iterators are a kind of more natural.  When you solve a problem, you tend to think in terms "process all elements from...", or mathematically "for all elements in...".  The only conventional way to do that is to use a loop.  The while loop in C-family languages is too general; you have do some steps on your own.  The for loop in C-family languages is a small syntactic improvement of the while.  In other programming languages, the for loop is a counted loop.  But this also means that you have to transform an index to the indexed element.  Because of that, you often tend to put the elements into some indexed structure -- to an array or to a vector.

If you think more about it, what your really need is a kind of generalized loop that loops through all elements of a container without neccessarily preparing some numeric index.  If you personify the process, the worker says to another one "give me the next one", and not "give me the 3254th one".  This is exactly what iterators are good for.  The iterator is somehow type-bound to the container.  Then you may be not interested in internal details (whether it is indexed inside, or whether it is a linked structure).  In other words, the iterators bring more abstraction.

Unfortunately, the iterators are newer than the core of C++ and therefore there is no generalized loop and syntax to make all of this more apparent syntactically.  Once you get used to better sytax of the generalized loop (in other languages, like in Python where iterators work almost magically, hidden), you really miss that syntax in C++.  The new C++ standard is going to improve it a bit.
Random Solutions  
 
programming4us programming4us