New-style for on an iterator-range of filter_iterator of strings crashes/hangs
Hello, Using g++ 4.8.1 (g++ (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1) with boost 1.5.3, building the code below with {{{ g++ -o example/filter.out -std=c++0x -Wall -g -rdynamic -I/usr/include/boost example/filter.cpp }}} {{{ #include <vector> #include <string> #include <iostream> #include <functional> #include <boost/iterator/filter_iterator.hpp> #include <boost/range/iterator_range.hpp> using namespace std; using namespace boost; int main() { vector<string> ss{"hello", "world"}; // function<bool (const string &)> fn = [](const string &s){return false;}; function<bool (const string &)> fn = [](const string &s){return s.size() > 3;}; cout << fn("Hello") << endl; // (1) cout << fn("world") << endl; // (2) typedef filter_iterator<function<bool (const string &)>, vector<string>::const_iterator> filter_it_t; auto r = make_iterator_range(filter_it_t(fn, ss.begin()), filter_it_t(fn, ss.end())); for(const string &a: r) cout << a << endl; return 0; } }}} yields an executable that crashes with {{{ Segmentation fault (core dumped) }}} Exchanging the comment in the two lines {{{ // function<bool (const string &)> fn = [](const string &s){return false;}; function<bool (const string &)> fn = [](const string &s){return s.size() > 3;}; }}} (so that the first lambda is used) yields an executable that hangs. In either case, the application first prints the results of the lines marked (1) and (2). Can't figure out what I'm doing wrong, and would appreciate advice. Thanks, Ami
AMDG On 11/23/2013 11:12 AM, Ami Tavory wrote:
<snip> typedef filter_iterator<function<bool (const string &)>, vector<string>::const_iterator> filter_it_t; auto r = make_iterator_range(filter_it_t(fn, ss.begin()), filter_it_t(fn, ss.end())); <snip>
yields an executable that crashes with {{{ Segmentation fault (core dumped) }}}
<snip>
You're not constructing the filter_iterators correctly.
From the documentation:
filter_iterator(Predicate f, Iterator x, Iterator end = Iterator()); Effects: Constructs a filter_iterator where m_iter is either the first position in the range [x,end) such that f(*m_iter) == true or else``m_iter == end``. The member m_pred is constructed from f and m_end from end. You need to pass the end iterator as well. (Or use the Boost.Range version) In Christ, Steven Watanabe
participants (2)
-
Ami Tavory
-
Steven Watanabe