简体   繁体   中英

Issues with using Custom iterators for regex_iterator

I want to do regex search on a text where I want to skip certain characters from the text. Original question asked here : Regular Expression library that maintains state, takes input character by character and returns true whenever match is found For this I have made a custom iterator and am trying to pass those iterators to regex_iterator. But I am getting following errors:


regex(2775): error C2512: 'fixed_array::iterator' : no appropriate default constructor available
          with
          [
              T=char
          ]
regex(2773) : while compiling class template member function 'std::tr1::regex_iterator::regex_iterator(void)'
          with
          [
              _BidIt=fixed_array::iterator
          ]
iterator.cpp(168) : see reference to class template instantiation 'std::tr1::regex_iterator' being compiled
          with
          [
              _BidIt=fixed_array::iterator
          ]
regex(2775): error C2512: 'fixed_array::iterator' : no appropriate default constructor available
          with
          [
              T=char
          ]

Here's my code:



    template 
    class fixed_array
    {
        public:

        typedef int size_type;

        class iterator
        {
            public:
            typedef iterator self_type;
            typedef T value_type;
            typedef T& reference;
            typedef T* pointer;
            typedef std::bidirectional_iterator_tag iterator_category;
            typedef int difference_type;
            iterator(pointer ptr) : ptr_(ptr) { }

            self_type operator++() /*skip character 'a'*/
            {
                self_type i = *this;
                ptr_++;
                if(*ptr_ == 'a')
                ptr_++;
                return i;
            }

            self_type operator++(int junk)
            {
                ptr_++;
                if(*ptr_ == 'a')
                ptr_++;
                return *this;
            }

            reference operator*()
            {
                return *ptr_;
            }

            pointer operator->()
            {
                return ptr_;
            }

            bool operator==(const self_type& rhs)
            {
                return ptr_ == rhs.ptr_;
            }

            bool operator!=(const self_type& rhs)
            {
                return ptr_ != rhs.ptr_;
            }
            private:
            pointer ptr_;
        };

        class const_iterator
        {
            public:
            typedef const_iterator self_type;
            typedef T value_type;
            typedef T& reference;
            typedef T* pointer;
            typedef int difference_type;
            typedef std::bidirectional_iterator_tag iterator_category;
            const_iterator(pointer ptr) : ptr_(ptr) { }
            self_type operator++() { self_type i = *this; ptr_++; return i; }
            self_type operator++(int junk) { ptr_++; return *this; }
            const reference operator*() { return *ptr_; }
            const pointer operator->() { return ptr_; }
            bool operator==(const self_type& rhs) { return ptr_ == rhs.ptr_; }
            bool operator!=(const self_type& rhs) { return ptr_ != rhs.ptr_; }
            private:
            pointer ptr_;
        };


        fixed_array(size_type size) : size_(size) {
            data_ = new T[size_];
        }

        size_type size() const { return size_; }

        T& operator[](size_type index)
        {
            assert(index < size_);
            return data_[index];
        }

        const T& operator[](size_type index) const
        {
            assert(index < size_);
            return data_[index];
        }

        iterator begin()
        {
            return iterator(data_);
        }

        iterator end()
        {
            return iterator(data_ + size_);
        }

        const_iterator begin() const
        {
            return const_iterator(data_);
        }

        const_iterator end() const
        {
            return const_iterator(data_ + size_);
        }

        private:
        T* data_;
        size_type size_;
    };

    using namespace std;

    int main()
    {
        fixed_array<char> point3d(50);

        //initialize the array with some string.
        regex e ("a.*ea");

        fixed_array<char>::iterator beg = point3d.begin();
        fixed_array<char>::iterator end = point3d.end();

        regex_iterator<fixed_array<char>::iterator> rit ( beg, end, e );
        regex_iterator<fixed_array<char>::iterator> rend;

        while (rit!=rend) {
            cout << rit->str() << std::endl;
            ++rit;
        }
        return 0;
    }

Filter iterators are tricky to get right. Also, your const and non-const iterators are inconsistent.

I recommend you use a Boost filter_iterator instead of writing your own thing.

Ok finally with the help of answer by Sebastian, and some research, I was able to achieve what i intended to do.

I used the filter iterator code given at the following page : http://blogs.msdn.com/b/vcblog/archive/2010/08/09/the-filterator.aspx

Here is what i wrote apart from the iterator above:

struct is_current_charT {
    bool operator()(char s) const {
        return s != 't';
    }
};

int main() {
    using namespace std;

    string str = "test1 ,,ktest2,, ktest3,, ktest0,,";
    regex e ("kes[0-9]");

    auto fit = make_filterator(str.begin(), str.end(),
        is_current_charT());

    filterator<string::iterator,is_current_charT> cdogs(fit);

    regex_iterator<filterator<string::iterator,is_current_charT>> rit ( cdogs, cdogs.end(), e );
    regex_iterator<filterator<string::iterator,is_current_charT>> rend;

    while (rit!=rend) {
        cout << rit->str() << std::endl;
        ++rit;
    }
}

OutPut:

kes2
kes3
kes0

This can now easily be modified to write more meaningful filtering functions.

Thanks Ahmed and thanks Sebastian!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM