空卷括号{}作为范围的结尾

时间:2015-05-08 12:40:10

标签: c++ c++11 iterator

我在Yosemite的XCode上运行。

代码编译但在运行时崩溃,为什么?

我故意使用" {}"在第二个std :: copy中作为"范围的结束"。

我试验了这段代码是因为一个使用" {}"的工作示例as"默认构造流迭代器作为范围的结尾"。

那么为什么(见第二个代码)一个正在工作但是这个(第一个代码)一个失败了?

#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));

}

以下代码来自C ++标准库第二版。

&#34; //源头&#34;可能是&#34; istream_iterator(),&#34;或者只是&#34; {},&#34;

两者都有效,因为:引自本书

&#34;请注意,从C ++ 11开始,您可以将空的花括号而不是默认构造的流迭代器作为范围的结尾传递。这是有效的,因为定义源范围结束的参数类型是从定义源范围开始的前一个参数推导出来的。&#34;

/* 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
}

1 个答案:

答案 0 :(得分:5)

第一个失败,因为迭代器的类型不是var itemsPerPage = 2; // set the number of items you want per page var store = Ext.create('Ext.data.Store', { id:'simpsonsStore', autoLoad: false, fields:['name', 'email', 'phone'], pageSize: itemsPerPage, // items per page proxy: { type: 'ajax', url: 'pagingstore.js', // url that will load data with respect to start and limit params reader: { type: 'json', root: 'items', totalProperty: 'total' } } }); // specify segment of data you want to load using params store.load({ params:{ start:0, limit: itemsPerPage } });

对于stream_iterator情况,默认构造函数具有特殊含义 - EOF。表示容器末尾的迭代器不是默认构造的。 (在实践中,对于简单的容器,迭代器可以只是指针)。

除了流迭代器之外的默认构造迭代器通常没有多大意义,并且在这个实例中没有你想要的语义。

(除了流迭代器之外,其他一些来自boost的迭代器也遵循与流迭代器相同的模式)。