Pytanie : Pomagać dlaczego jeden kod być lepszy the jeden .....

Kod #1 i kod #2 dokonywać the ten sam rezultat.  I potrzebować pomoc zrozumienie dlaczego jeden móc lepszy 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 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

struct StudentAttempt
{
   int odległość;
   smyczkowy studentName;
};

bool cmpAttempts (StudentAttempt opuszczać, StudentAttempt dobro) {
   jeżeli (left.distance < right.distance) {
      powrót prawdziwy;
   }
   inny jeżeli (left.distance == right.distance) {
      jeżeli (left.studentName < right.studentName) {
         powrót prawdziwy;
      }
      inny
         powrotny fałszywy;
   }
   inny
      powrotny fałszywy;
}

bool isDistEqual (StudentAttempt opuszczać, StudentAttempt dobro) {
   powrót (left.distance == right.distance
      && left.studentName! = right.studentName);
}

size_t printAllEqual (const vector& v, const StudentAttempt& suma, stringstream& ss) {

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

  podczas gdy (i! = v.end ()) {

    jeżeli (isDistEqual (*i, suma)) {
    
      jeżeli (! bFirst) ss << ",";
      ss << i->studentName;
      ++sz;
    }

    ++i; 
    bFirst = fałszywy;
  }

  powrotny sz;
}
 

int magistrala () {

   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 obchodzić się;

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

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


   dla (; ono! = dist.end (); it++) {

      stringstream ss;

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

      jeżeli (! p.second) kontynuować; // już obchodzić się

      jeżeli ((0) < printAllEqual (dist, *it, ss)) 
        cout << setw (2) << (*it) .distance 
           << "cieki:  " << (*it) .studentName << ss.str () << endl;
   }
}

KOD #2:
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

struct StudentAttempt
{
   int odległość;
   smyczkowy studentName;
};

 bool cmpAttempts (StudentAttempt opuszczać, StudentAttempt dobro) {
   jeżeli (left.distance < right.distance) 
   {
      powrót prawdziwy;
   }
   inny jeżeli (left.distance == right.distance) 
   {
      jeżeli (left.studentName < right.studentName) 
	  {
         powrót prawdziwy;
      }
      inny
         powrotny fałszywy;
   }
   inny
      powrotny fałszywy;
}

int magistrala () {

   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 obchodzić się;

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

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

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

      jeżeli (p.second)  
	  {
		  int y;

     	  dla (y=0; y < dist.size (); y++) 
		  {
			  jeżeli (dist [x] .distance == dist [y] .distance && dist [x] .studentName! = dist [y] .studentName)
				{
 					  ss << ",";
					  ss << dist [y] .studentName;
					  z += (1);
				}
		  }
	 }
	jeżeli (z > (0))
	  {
	   cout << setw (2) << dist [x] .distance << "cieki: " << dist [x] .studentName << ss.str () << endl;
	   z = (0);
	  }
   }
}

Odpowiedź : Pomagać dlaczego jeden kod być lepszy the jeden .....

Dla iterators… Ono móc w ten sposób przy w ten sposób, ale iterators być jakby naturalny.  Gdy ty rozwiązywać problem, ty miewać skłonność w termin "przetwarzać wszystkie element od…", lub matematycznie "dla wszystkie element w…".  The jedyny konwencjonalny sposób który być pętla.  The chwila pętla w C-Rodzina język być zbyt generał; ty mieć robić niektóre krok na twój mieć.  The dla pętla w C-Rodzina język być mały składniowy ulepszenie the chwila.  W inny język programowania, the dla pętla być liczyć pętla.  Ale element także znaczyć że ty musieć wskaźnik the także element.  Przez struktura, ty często miewać skłonność the element w niektóre niektóre struktura -- szyk lub wektor.

Jeżeli ty myśleć bardziej o ono, myśleć twój naprawdę potrzeba być jakby generalizować pętla który zapętlać przez wszystkie element zbiornik bez koniecznie niektóre numeryczny wskaźnik.  Jeżeli ty personifikować the proces, the pracownik mówić inny jeden "dawać the następny jeden", i nie "dawać the 3254th jeden".  Iterators być dokładnie być iterators być dobry dla.  The iterator być jakoś typ-granica the zbiornik.  Wtedy ty móc zainteresowany w wewnętrzny szczegół (czy ono indexed wewnętrzny, lub czy ono być łączyć struktura).  W inny słowo, the iterators przynosić więcej abstrakcja.

Niestety, the iterators być nowy the sedno C++ i tym samym tam  być żadny generalizować pętla i składnia tym samym ten pozorny pozorny.  Jak Tylko ty dostawać używać sytax the generalizować pętla (w inny język, jak w Pyton dokąd iterators pracować prawie magicznie, chować), ty naprawdę brakować ten składnia w C++.  The nowy C++ standard iść ono trochę.
Inne rozwiązania  
 
programming4us programming4us