Инициализировать итератор с указателем в C ++ - PullRequest
2 голосов
/ 22 августа 2011

У меня проблемы с созданием библиотеки в VC9, но ранее она была успешно построена в VC6.Вот часть кода:

size_t pos2find;
pos2find = J; 
std::vector<size_t>::iterator it(&pos2find);

А вот ошибка:

    error C2664: 'std::_Vector_iterator<_Ty,_Alloc>::_Vector_iterator(const std::_Vector_iterator<_Ty,_Alloc> &)' : cannot convert parameter 1 from 'size_t *' to 'const std::_Vector_iterator<_Ty,_Alloc> &'
    1>        with
    1>        [
    1>            _Ty=size_t,
    1>            _Alloc=std::allocator<size_t>
    1>        ]
    1>        Reason: cannot convert from 'size_t *' to 'const std::_Vector_iterator<_Ty,_Alloc>'

1>        with
1>        [
1>            _Ty=size_t,
1>            _Alloc=std::allocator<size_t>
1>        ]
1>        No constructor could take the source type, or constructor overload resolution was ambiguous

Я ценю любую помощь.

РЕДАКТИРОВАТЬ: Код отбиблиотека с открытым исходным кодом под названием "surfit", это не мой код, так что я думаю, что это изменилось в стандарте векторного класса.Затем итератор используется в другой стандартной функции:

std::vector<size_t>::iterator * ptr_from = fault->sort_by_first_begin;
std::vector<size_t>::iterator * ptr;
ptr = std::lower_bound(ptr_from, 
               fault->sort_by_first_end, 
               it, 
               ptr_size_t_less);

РЕДАКТИРОВАТЬ: я думаю, что я нашел решение.После просмотра std :: lower_bound ():

template <class ForwardIterator, class T, class Compare>
  ForwardIterator lower_bound ( ForwardIterator first, ForwardIterator last,
                                const T& value, Compare comp );

Return iterator to lower bound
Returns an iterator pointing to the first element in the sorted range [first,last) which does not compare less than value. The comparison is done using either operator< for the first version, or comp for the second.

For the function to yield the expected result, the elements in the range shall already be ordered according to the same criterion (operator< or comp).

С этим я просто исключил итератор it и использовал lower_bound (first, last, & pos2find, comp);

Ответы [ 4 ]

4 голосов
/ 22 августа 2011

Итератор в векторе не гарантированно является необработанным указателем. В VS6 vector<T>::iterator оказалось T*, поэтому вы можете инициализировать итератор с T*. В более поздних версиях VS реализация vector<T>::iterator изменилась на тип класса (как и должно быть), поэтому код, который сделал неверные предположения, теперь не может компилироваться.

В любом случае отправленный вами код содержит ошибки, даже если iterator равен T*, так как указатель не является указателем на вектор.

4 голосов
/ 22 августа 2011

Хорошо, опубликованный код не имеет никакого смысла даже в VC6.Но, возможно, вы ищете что-то вроде этого

std::vector<size_t>::iterator it = some_vector.begin() + pos2find;

Если нет, то вам лучше опубликовать немного больше кода, чтобы мы могли видеть, как вы пытаетесь использовать итератор.

2 голосов
/ 22 августа 2011

Исходный код опирается на детали реализации, которые не гарантированы стандартом, то есть тот факт, что итераторы std::vector могут быть реализованы как указатели. Я не уверен, так ли это на самом деле, но в более поздних версиях Visual C ++ реализация изменилась на конкретный шаблон класса.

Я боюсь, что вам придется пройтись по всему коду и исправить все, тем более что, как уже отмечалось, ваш пример содержит ошибки, даже учитывая то, что я только что написал.

Помните, что с указателями вы можете использовать 0 для обозначения «итератор не установлен», что будет отличаться от назначения some_vector.end(). Если вы столкнулись с подобной ситуацией, я предлагаю вам использовать Boost.Optional , чтобы обернуть ваш итератор.

Был там, сделал это (но с другим компилятором).

1 голос
/ 22 августа 2011

Кажется, что следующее предназначено

std::vector<size_t> tmp;
tmp.push_back(J);
std::vector<size_t>::iterator it = tmp.begin();

std::vector<size_t>::iterator * ptr_from = fault->sort_by_first_begin;
std::vector<size_t>::iterator * ptr;
ptr = std::lower_bound(ptr_from, 
               fault->sort_by_first_end, 
               it, 
               ptr_size_t_less);

Сумасшедший код (отсортированный массив итераторов, правда?), И я не тестировал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...