2015-05-08 11 views
5

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 
} 

Antwort

5

Die erste ist fehlgeschlagen, weil die Art Ihres Iterator keine stream_iterator ist.

Für den Fall stream_iterator hat der Standardkonstruktor eine spezielle Bedeutung - EOF. Der Iterator, der das Ende eines Containers darstellt, ist nicht standardmäßig konstruiert. (In der Praxis für einfache Container können Iteratoren nur Zeiger sein).

Andere Standard-Iteratoren als Stream-Iteratoren sind normalerweise nicht sinnvoll und haben in diesem Fall nicht die gewünschte Semantik.

(Einige andere Iteratoren von Boost neben Stream-Iteratoren folgen demselben Muster wie Stream-Iteratoren).

+2

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

+0

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). –

+0

@ 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. –

Verwandte Themen