Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > вопрос по итераторам


Автор: knut 5.6.2006, 19:50
У неня такая задача ест функц.OnLButtonDown
мне надо заполнить массив поиннами с помашю итератора и нарисовать rectangle :

void CTestView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    using namespase std;
    vector<CPoint>vec;
    vector<CPoint>::iterator it;
    for(it = vec.begin();it!=vec.end();it++)
    {
        CPoint a_point;
        a_point = (*it);
        vec.push_back(point);
        rect.SetRect(vec[*it].x + 5,vec[it].y + 5,vec[it].x - 5,vec[it].y - 5);
    }
    CView::OnLButtonDown(nFlags, point);
}
почему не пашит?
 

Автор: ZeusAtVingrad 5.6.2006, 20:28
Цитата(knut @ 5.6.2006,  19:50)
У неня такая задача ест функц.OnLButtonDown
мне надо заполнить массив поиннами с помашю итератора и нарисовать rectangle :

void CTestView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    using namespase std;
    vector<CPoint>vec;
    vector<CPoint>::iterator it;
    for(it = vec.begin();it!=vec.end();it++)
    {
        CPoint a_point;
        a_point = (*it);
        vec.push_back(point);
        rect.SetRect(vec[*it].x + 5,vec[it].y + 5,vec[it].x - 5,vec[it].y - 5);
    }
    CView::OnLButtonDown(nFlags, point);
}
почему не пашит?

Наверное потому что у тебя вектор пустой.

Вот это:
Код

vec[*it].x + 5,vec[it].y + 5,vec[it].x - 5,vec[it].y - 5

вообще что-то несусветное.

И встречный вопрос: А как именно не пашет-то?

ЗЫ: Что-то тебе с языком делать надо. 

Автор: MAKCim 5.6.2006, 20:41
Цитата

Код

for(it = vec.begin();it!=vec.end();it++)


vec.begin()==vec.end() на первой итерации

Добавлено @ 20:42 
Цитата

Код

a_point = (*it);


зачем? 

Автор: Succorso 5.6.2006, 23:09
knut, весь алгоритм с итераторами насмарку:

1) как было сказано выше - у тебя действительно пустой вектор, и ни одной итерации не будет выполнено.
2) в качестве параметра оператору [] нужен интегральный тип "int" (если ты оператор ранее не перегружал), а тут 

Цитата(knut @  5.6.2006,  19:50 Найти цитируемый пост)
vec[*it].x


ты передаёшь, в качестве индекса переменную не типа int, а типа CPoint. Конечно же, компиллятор не может сделать преобразование в int.

А тут 
Цитата(knut @  5.6.2006,  19:50 Найти цитируемый пост)
vec[it].y + 5,vec[it].x - 5,vec[it].y - 5

вообще в качестве индекса ты передаёшь  адрес в памяти. smile  smile  smile 

Советую побольше почитать информации по контейнерам. smile  

Автор: knut 6.6.2006, 09:58
благодарности всем.

Ну я веть в функц. void CTestView::OnLButtonDown(UINT nFlags, CPoint point) забиваю вектор поинтами
vec.push_back(point)?
Succorso 
Если мне взать 
vector<CPoint>vec;
vector<int>::iterator it;   итератор типа int ,а вектор  у меня CPoint то  будут такие ошыбки 

error C2440: '=' : cannot convert from 'class CPoint *' to 'int *'
error C2446: '!=' : no conversion from 'class CPoint *' to 'int *'
error C2230: '!=' : indirection to different types 
тогда как?
Скинь инф. илеи сылки по контейнерам если не трудно.
 
 


 

Автор: MAKCim 6.6.2006, 10:02
Цитата

Ну я веть в функц. void CTestView::OnLButtonDown(UINT nFlags, CPoint point) забиваю вектор поинтами
vec.push_back(point)?

До этой строчки дело не доходит!
 

Автор: ZeusAtVingrad 6.6.2006, 10:47
Цитата(Succorso @ 5.6.2006,  23:09)
А тут 
Цитата(knut @  5.6.2006,  19:50 Найти цитируемый пост)
vec[it].y + 5,vec[it].x - 5,vec[it].y - 5

вообще в качестве индекса ты передаёшь  адрес в памяти. smile  smile  smile 

Не адрес в памяти, а объект std::vector<CPoint>::iterator

Кстати, в общем случае, если в контейнер добавлены или удалены данные - итератор становится недействительным? Или это только при удалении? 

Автор: Earnest 6.6.2006, 18:55
Цитата(knut @  6.6.2006,  10:58 Найти цитируемый пост)
Ну я веть в функц. void CTestView::OnLButtonDown(UINT nFlags, CPoint point) забиваю вектор поинтами
vec.push_back(point)?

При этом из него же и пытаешься точки брать (а их там нет - какая досада!  smile ).

Цитата(ZeusAtVingrad @  6.6.2006,  11:47 Найти цитируемый пост)
Кстати, в общем случае, если в контейнер добавлены или удалены данные - итератор становится недействительным? Или это только при удалении?  

Смотря какой контейнер. Если вектор, то все итераторы становятся недействительными как при вставке, так и при удалении (Т.е. они могут случайно остаться действительными, но полагаться на это нельзя.) То же верно и  для деки. Списки, наборы, отображения - итераторы всегда остаются действительными кроме итератора на удаленный элемент.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)