Ich bin auf XCode, Yosemite ausgeführt.leere geschweifte Klammer {} als Ende des Bereichs
Folgender Code kompiliert, aber stürzt zur Laufzeit ab, warum?
Ich verwendete absichtlich "{}" in der zweiten std :: copy als "Ende der Reichweite".
Ich experimentierte diesen Code wegen eines Arbeitsbeispiels, das "{}" als "standardmäßig konstruierten Stream-Iterator als Ende des Bereichs" verwendete.
Warum also (siehe 2. Code) funktioniert man aber dieser (1. Code) ist gescheitert?
#include <algorithm>
#include <iterator>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> coll1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// copy the elements of coll1 into coll2 by appending them
vector<int> coll2;
copy (coll1.cbegin(), coll1.cend(), // source
back_inserter(coll2)); // destination
vector<int> coll3;
copy (coll1.begin(), {},
back_inserter(coll3));
}
folgender Code wird aus der C++ Standard Library zweiten Auflage.
Die Zeile mit "// Ende der Quelle" könnte entweder "istream_iterator()" oder einfach "{}"
beiden Werke, weil: aus dem Buch zitiert
„Beachten Sie, dass Seit C++ 11 können Sie leere geschweifte Klammern anstelle eines standardmäßig konstruierten Stream-Iterators als Ende des Bereichs übergeben, da der Typ des Arguments, das das Ende des Quellbereichs definiert, aus dem vorherigen Argument abgeleitet wird, das das Argument definiert Beginn des Quellbereichs. "
/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference, 2nd Edition"
* by Nicolai M. Josuttis, Addison-Wesley, 2012
*
* (C) Copyright Nicolai M. Josuttis 2012.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#include <iterator>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main()
{
vector<string> coll;
// read all words from the standard input
// - source: all strings until end-of-file (or error)
// - destination: coll (inserting)
copy (istream_iterator<string>(cin), // start of source
{}, // end of source
back_inserter(coll)); // destination
// sort elements
sort (coll.begin(), coll.end());
// print all elements without duplicates
// - source: coll
// - destination: standard output (with newline between elements)
unique_copy (coll.cbegin(), coll.cend(), // source
ostream_iterator<string>(cout,"\n")); // destination
}
haben es geschafft. {} bedeutet nur Standard-Iteratoren zu konstruieren; es ist die Bedeutung des Standardkonstruktors von stream_iterator, die in diesem Kontext speziell gemacht wurde. Der zweite ist ein Trick, ein guter Trick. – milesma
In der heutigen Zeit sind Iteratoren in der Regel keine Zeiger, auch nicht in den Fällen, in denen sie möglich sind (Vektoren und Strings). –
@ T.C. Auch wenn sie keine Zeiger sind, sind Vektor- und String-Iteratoren typischerweise dünne Wrapper um Zeiger, zumindest in optimierten Builds. Die Grundannahmen für effiziente Iteratoren haben sich nicht allzu sehr verschoben. Zum Beispiel wird für libstdC++ dieser dünne Wrapper __gnu_cxx :: __ normal_iterator genannt. –