Frage : Mir helfen, zu verstehen, warum ein Code ist besser als der andere .....

erzielt Code #1 und Code #2 das gleiche Resultat.  Ich benötige Hilfenverständnis, warum man als das other. besser sein kann
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:
6:
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-Geschlechtskrankheit;

struct StudentAttempt
{
   int-Abstand;
   Schnur studentName;
};

bool cmpAttempts (StudentAttempt gelassen, StudentAttempt Recht) {
   wenn (left.distance < right.distance) {
      Rückhol ausrichten;
   }
   sonst, wenn (left.distance == right.distance) {
      wenn (left.studentName < right.studentName) {
         Rückhol ausrichten;
      }
      sonst
         Rückholfalsches;
   }
   sonst
      Rückholfalsches;
}

bool isDistEqual (StudentAttempt gelassen, StudentAttempt Recht) {
   zurückgehen (left.distance == right.distance
      && left.studentName! = right.studentName);
}

size_t printAllEqual (const vector& V, const StudentAttempt& sa, stringstream& SS) {

   vector:: const_iterator I = v.begin ();
  size_t SZ = 0;
  bool bFirst = richten aus;

  während (i! = v.end ()) {

    wenn (isDistEqual (*i, sa)) {
    
      wenn (! bFirst) SS << „,“;
      SS << i->studentName;
      ++sz;
    }

    ++i; 
    bFirst = falsch;
  }

  Rückholsz;
}
 

int-Hauptleitung () {

   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 behandelt;

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

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


   für (; es! = dist.end (); it++) {

      stringstream SS;

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

      wenn (! p.second) fahren fort; // bereits behandelt

      wenn (0 < printAllEqual (dist, *it, SS)) 
        cout << setw (2) << (*it) .distance 
           << „Füße:  “ << (*it) .studentName << ss.str () << endl;
   }
}

CODE #2:
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace-Geschlechtskrankheit;

struct StudentAttempt
{
   int-Abstand;
   Schnur studentName;
};

 bool cmpAttempts (StudentAttempt gelassen, StudentAttempt Recht) {
   wenn (left.distance < right.distance) 
   {
      Rückhol ausrichten;
   }
   sonst, wenn (left.distance == right.distance) 
   {
      wenn (left.studentName < right.studentName) 
	  {
         Rückhol ausrichten;
      }
      sonst
         Rückholfalsches;
   }
   sonst
      Rückholfalsches;
}

int-Hauptleitung () {

   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 behandelt;

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

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

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

      wenn (p.second)  
	  {
		  int y;

     	  für (y=0; y < dist.size (); y++) 
		  {
			  wenn (dist [x] .distance == dist [y] .distance && dist [x] .studentName! = dist [y] .studentName)
				{
 					  SS << „,“;
					  SS << dist [y] .studentName;
					  z += 1;
				}
		  }
	 }
	wenn (z > 0)
	  {
	   cout << setw (2) << dist [x] .distance << „Füße: “ << dist [x] .studentName << ss.str () << endl;
	   z = 0;
	  }
   }
}

Antwort : Mir helfen, zu verstehen, warum ein Code ist besser als der andere .....

Für iterators… Er kann das erste mal nicht so betrachten, aber iterators sind eine Art von natürlicherem.  Wenn Sie ein Problem lösen, neigen Sie, in den Ausdrücken zu denken „verarbeiten alle Elemente von…“ oder mathematisch „für alle Elemente in…“.  Die einzige herkömmliche Weise zu tun, die, eine Schleife zu benutzen ist.  Die Weileschleife in den C-Familie Sprachen ist zu allgemein; Sie haben tun einige Schritte auf Ihren Selbst.  Für Schleife in den C-Familie Sprachen ist eine kleine syntaktische Verbesserung von wann.  In anderen Programmiersprachen für Schleife ist eine gezählte Schleife.  Aber dieses bedeutet auch, dass Sie einen Index zum indexierten Element umwandeln müssen.  Wegen dessen neigen Sie häufig, die Elemente in irgendeine indexierte Struktur zu setzen -- zu einer Reihe oder zu einem Vektor.

Wenn Sie mehr an ihn denken, was Ihre wirklich Notwendigkeit eine Art generalisierte diese Schleife Schleifen durch alle Elemente eines Behälters ist, ohne irgendeinen numerischen Index notwendigerweise vorzubereiten.  Wenn Sie den Prozess verkörpern, sagt die Arbeitskraft bis eine andere „geben mir das folgende“, und nicht „mir das 3254. geben“.  Für dieses ist genau, was iterators gut sind.  Das iterator ist Art-springen irgendwie zum Behälter.  Dann können Sie ausführlich interne nicht interessiert sein (ob es nach innen registriert oder ob es eine verbundene Struktur ist).  Das heißt, holen die iterators mehr Abstraktion.

Leider sind die iterators neuer, als der Kern von C++ und folglich dort keine generalisierte Schleife und Syntax ist, zum alle von diesem offensichtlicheren syntaktisch zu bilden.  Sobald Sie besseres sytax der generalisierten Schleife gewöhnen an (in anderen Sprachen, wie in der Pythonschlange, in der iterators fast magisch arbeiten, versteckt), verfehlen Sie wirklich diese Syntax in C++.  Der neue C++ Standard wird es verbessern eine Spitze.
Weitere Lösungen  
 
programming4us programming4us