Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 12:47
Оценка:
Если я определяю вектор STL, по значению а не указателю,
вот так:

typedef vector<CVariableShift> type_DevStrVector;

struct CVariableShift
{
int i;
};




то если у меня есть итератор на элемент какой-то,
то как из него взять значение переменной ?

т.е.
получается только так:
через преобразование в указатель:

int j = it->i; // Работает удобно, но для внутренних членов только, а надо саму копию структуры

 l_VariableShift = *(CVariableShift*)(&it); //неудобно, ненормально

  //а не как обычно в map:
  //l_VariableShift = it->second;



можно как-то без перобразований обойтись?

Спасибо
Винтовку добудешь в бою!
Re: Как брать значение вектора по итератору?
От: Анатолий Широков СССР  
Дата: 16.02.04 12:48
Оценка: 2 (1)
CVariableShift &l_VariableShift = (*it);
Re: Как брать значение вектора по итератору?
От: Lorenzo_LAMAS  
Дата: 16.02.04 12:52
Оценка:
Не надо таких кошмарных преобразований.

#include <iostream>
#include <vector>

struct S
{
   int i_;
   double d_;
};

void g()
{
   std::vector<S>a(10);
   std::vector<S>::const_iterator v_it = a.begin() + 3;
   std::cout<<(*v_it).i_<<" "<<(*v_it).d_<<std::endl;

   const S & rs = *v_it;
   //std::cout<<rs.i_<<" "<<rs.d_<<std::endl;


}
Of course, the code must be complete enough to compile and link.
Re[2]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 12:59
Оценка:
АШ>
АШ>CVariableShift &l_VariableShift = (*it);
АШ>


Да,...
Не всегда догадливость работает...

У вектора итератор все равно указатель.
Винтовку добудешь в бою!
Re[3]: Как брать значение вектора по итератору?
От: WolfHound  
Дата: 16.02.04 13:08
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>У вектора итератор все равно указатель.

1)Не факт.
2)Для других итераторов также можно получить значение. Вернее ссылку.

ЗЫ STL итераторы спроектированы так чтобы максимально походить на указатели.
ЗЗЫ Везде где нужны итераторы можно использовать указатели но не везде где нужны указатели можно использовать итераторы.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Как брать значение вектора по итератору?
От: jazzer Россия Skype: enerjazzer
Дата: 16.02.04 13:12
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Не надо таких кошмарных преобразований.


L_L>
L_L>#include <iostream>
L_L>#include <vector>

L_L>struct S
L_L>{
L_L>   int i_;
L_L>   double d_;
L_L>};

L_L>void g()
L_L>{
L_L>   std::vector<S>a(10);
L_L>   std::vector<S>::const_iterator v_it = a.begin() + 3;
L_L>   std::cout<<(*v_it).i_<<" "<<(*v_it).d_<<std::endl;
   std::cout << v_it->i_ << " " << v_it->d_ << std::endl; //а еще можно так :)
L_L>   const S & rs = *v_it;
L_L>   //std::cout<<rs.i_<<" "<<rs.d_<<std::endl;


L_L>}
L_L>
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 13:21
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, vgrigor, Вы писали:


V>>У вектора итератор все равно указатель.

WH>1)Не факт.
WH>2)Для других итераторов также можно получить значение. Вернее ссылку.

WH>ЗЫ STL итераторы спроектированы так чтобы максимально походить на указатели.

WH>ЗЗЫ Везде где нужны итераторы можно использовать указатели но не везде где нужны указатели можно использовать итераторы.

Спасибо,

Пример приведите, где итератор — ссылка?
Винтовку добудешь в бою!
Re[5]: Как брать значение вектора по итератору?
От: jazzer Россия Skype: enerjazzer
Дата: 16.02.04 13:23
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Здравствуйте, WolfHound, Вы писали:


WH>>Здравствуйте, vgrigor, Вы писали:


V>>>У вектора итератор все равно указатель.

WH>>1)Не факт.
WH>>2)Для других итераторов также можно получить значение. Вернее ссылку.

WH>>ЗЫ STL итераторы спроектированы так чтобы максимально походить на указатели.

WH>>ЗЗЫ Везде где нужны итераторы можно использовать указатели но не везде где нужны указатели можно использовать итераторы.

V>Спасибо,


V>Пример приведите, где итератор — ссылка?


имеется в виду, что выражение *iterator есть ссылка на объект, на который сейчас указывает iterator.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 13:45
Оценка:
V>>Пример приведите, где итератор — ссылка?

J>имеется в виду, что выражение *iterator есть ссылка на объект, на который сейчас указывает iterator.


т.е. побитового копирования, или просто .= не происходит ??
Винтовку добудешь в бою!
Re[3]: Как брать значение вектора по итератору?
От: Павел Кузнецов  
Дата: 16.02.04 13:56
Оценка:
Здравствуйте, vgrigor, Вы писали:

АШ>>
 АШ>> CVariableShift &l_VariableShift = (*it);
 АШ>>


v> У вектора итератор все равно указатель.


Не обязательно. В данном случае это, вообще, не существенно: если итератор
реализован классом, у него должна быть перегружена операция *.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 14:03
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, vgrigor, Вы писали:


АШ>>>
 АШ>>> CVariableShift &l_VariableShift = (*it);
 АШ>>>


v>> У вектора итератор все равно указатель.


ПК>Не обязательно. В данном случае это, вообще, не существенно: если итератор

ПК>реализован классом, у него должна быть перегружена операция *.

Интересно,

А у STL вектора он как реализован ?
Чего у него за оператор *?

А почему не просто указатель на тип по шаблону?
У нас же шаблоны по поределенному типу,
или смысл есть какой-то в дополнительном приведении типов
при этой операции?
Винтовку добудешь в бою!
Re[5]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 14:18
Оценка:
V>А почему не просто указатель на тип по шаблону?
V>У нас же шаблоны по поределенному типу,
V>или смысл есть какой-то в дополнительном приведении типов
V>при этой операции?

Когда я изучал экзамены Мелкософта, 70-015,
то я удивлялся совершенно четкой роли и большой роли догадливоти,
в ответа на экзаменационные вопросы.

т.е. человек должен определить, что субекьтивно лучше
из правильных вариантов,
и не тот правильный вариант, прямо признается ошибкой.
Винтовку добудешь в бою!
Re[5]: Как брать значение вектора по итератору?
От: WolfHound  
Дата: 16.02.04 14:21
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>А у STL вектора он как реализован ?

V>Чего у него за оператор *?
Например в STL Port (в дебуг версии) итераторы проверяют выход за границу массива.
V>А почему не просто указатель на тип по шаблону?
В релизе как правило (для std::vector) так и есть.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: Как брать значение вектора по итератору?
От: WolfHound  
Дата: 16.02.04 14:21
Оценка: +1
Здравствуйте, vgrigor, Вы писали:

V>т.е. побитового копирования,

Что такое побитовое копирование? В С++ нет такого понятия.
Есть конструктор копирования и копирующие присваивание. И то и другое может содержать кучу дополнительных действий.
В данном случае ни какого копирования не происходит. Мало того что оно не нужно дык оно еще и испортит синематику итераторов.
V>или просто .= не происходит ??
А это что за оператор? Из какого языка? В С++ есть = но не .=
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 14:28
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, vgrigor, Вы писали:


V>>А у STL вектора он как реализован ?

V>>Чего у него за оператор *?
WH>Например в STL Port (в дебуг версии) итераторы проверяют выход за границу массива.
V>>А почему не просто указатель на тип по шаблону?
WH>В релизе как правило (для std::vector) так и есть.


Если итератор это готовый результат, то зачем ему смотреть не вышел ли он еще за пределы?

Это скорее операторы перемещения по вектору?
Винтовку добудешь в бою!
Re[7]: Как брать значение вектора по итератору?
От: Lorenzo_LAMAS  
Дата: 16.02.04 14:33
Оценка:
std::vector<int> a;//пустой вектор
std::vector<int>::iterator i =a.begin();//плохо
++i; //кто, как не итератор, должен будет проверить валидность такого? как это сделает 
//вектор?
Of course, the code must be complete enough to compile and link.
Re[8]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 14:41
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>
L_L>std::vector<int> a;//пустой вектор
L_L>std::vector<int>::iterator i =a.begin();//плохо
L_L>++i; //кто, как не итератор, должен будет проверить валидность такого? как это сделает 
L_L>//вектор?
L_L>


А почему плохо?
Винтовку добудешь в бою!
Re[9]: Как брать значение вектора по итератору?
От: Lorenzo_LAMAS  
Дата: 16.02.04 14:46
Оценка:
V>А почему плохо?

Потому, что дальше идет ++i
Of course, the code must be complete enough to compile and link.
Re[9]: Как брать значение вектора по итератору?
От: WolfHound  
Дата: 16.02.04 14:46
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>А почему плохо?

Ну хотябы по тому что там нет ни чего. Вернее еще хуже. Есть но что-то сомвсем другое и его можно испортить.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[10]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 14:52
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, vgrigor, Вы писали:


V>>А почему плохо?

WH> Ну хотябы по тому что там нет ни чего. Вернее еще хуже. Есть но что-то сомвсем другое и его можно испортить.

Там есть vector.end(),
который отлично проверяется пользователем всегда,
как его логика, а не внутреняя.
может ему надо было указатель на начало ?
Винтовку добудешь в бою!
Re[11]: Как брать значение вектора по итератору?
От: Lorenzo_LAMAS  
Дата: 16.02.04 14:57
Оценка:
Чтоб было понятнее, напишем так

class A
{
public:
    A():p_(new int)
    {}
    A(const A &):p_(new int)
    {}
    ~A()
    {
        delete p_;
    }
    A & operator = (const A & rhs)
    {
        if(&rhs != this)
        {
            delete p_;
            p_ = new int;
        }
        
        return *this;
    }
private:
    int * p_;
};

void  g()
{
    std::vector<A>a;
    A b;
    *a.begin() = b;
}
Of course, the code must be complete enough to compile and link.
Re[11]: Как брать значение вектора по итератору?
От: WolfHound  
Дата: 16.02.04 14:58
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Там есть vector.end(),

V>который отлично проверяется пользователем всегда,
В том то и дело что не всегда... Есть такие пользователи...
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 15:03
Оценка:
Тогда "ты сам" и должен переопределять итератор,
для проверок таких.

Разве нет?
Винтовку добудешь в бою!
Re[13]: Как брать значение вектора по итератору?
От: Lorenzo_LAMAS  
Дата: 16.02.04 15:04
Оценка:
V>Тогда "ты сам" и должен переопределять итератор,
V>для проверок таких.

Что значит переопределить итератор?

V>Разве нет?


Чего?
Of course, the code must be complete enough to compile and link.
Re[13]: Как брать значение вектора по итератору?
От: WolfHound  
Дата: 16.02.04 15:07
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Тогда "ты сам" и должен переопределять итератор, для проверок таких.

Как?
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[14]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 15:07
Оценка:
L_L>Чего?

Надо найти разумный пример где итереатор — ссылка.
Винтовку добудешь в бою!
Re[15]: Как брать значение вектора по итератору?
От: Lorenzo_LAMAS  
Дата: 16.02.04 15:10
Оценка:
V>Надо найти разумный пример где итереатор — ссылка.

Извини, опять не понял, о чем ты? Как может итерироваться ссылка? Или ты не о ссылках в смысле ссылок?
Of course, the code must be complete enough to compile and link.
Re[14]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 15:13
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, vgrigor, Вы писали:


V>>Тогда "ты сам" и должен переопределять итератор, для проверок таких.

WH>Как?

Наследуй, и переопределяй, как обычно для классов.
Винтовку добудешь в бою!
Re[16]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 15:17
Оценка:
L_L>Извини, опять не понял, о чем ты? Как может итерироваться ссылка? Или ты не о ссылках в смысле ссылок?

У нас речь шла об этом,
почитай тему.
Винтовку добудешь в бою!
Re[15]: Как брать значение вектора по итератору?
От: WolfHound  
Дата: 16.02.04 15:17
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Наследуй, и переопределяй, как обычно для классов.

Наследоваться от чего? От std::vector?
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: Как брать значение вектора по итератору?
От: Lorenzo_LAMAS  
Дата: 16.02.04 15:19
Оценка:
WH>Наследоваться от чего? От std::vector?

Нет, что ты, от std::vector<int>::iterator
Of course, the code must be complete enough to compile and link.
Re[17]: Как брать значение вектора по итератору?
От: WolfHound  
Дата: 16.02.04 15:20
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>У нас речь шла об этом, почитай тему.

Тебе сказали что оператор * итератора возвращает ссылку на объект, а не сам является ссылкой.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 15:20
Оценка: :))
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, vgrigor, Вы писали:


V>>Наследуй, и переопределяй, как обычно для классов.

WH>Наследоваться от чего? От std::vector?

Ясный день.
И от std::vector::iterator.
Винтовку добудешь в бою!
Re[17]: Как брать значение вектора по итератору?
От: WolfHound  
Дата: 16.02.04 15:24
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Ясный день.

V>И от std::vector::iterator.
И что ты мне предлагаешь для отладки весть std::vector переписать? И получить все тотже итератор отличный от указателя. К стати как та собираешься наследоваться от указателя? Ну в быню. Я лучше STL Port возьму.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[18]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 15:24
Оценка: :)
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, vgrigor, Вы писали:


V>>У нас речь шла об этом, почитай тему.

WH> Тебе сказали что оператор * итератора возвращает ссылку на объект, а не сам является ссылкой.

Так ты про указатель говорил ?
где нужна ссылка.
Винтовку добудешь в бою!
Re[19]: Как брать значение вектора по итератору?
От: Lorenzo_LAMAS  
Дата: 16.02.04 15:25
Оценка:
V>Так ты про указатель говорил ?
V>где нужна ссылка.

???????????????????????????????????????????????????????????????????????????????????
Of course, the code must be complete enough to compile and link.
Re[18]: Как брать значение вектора по итератору?
От: vgrigor  
Дата: 16.02.04 15:28
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, vgrigor, Вы писали:


V>>Ясный день.

V>>И от std::vector::iterator.
WH>И что ты мне предлагаешь для отладки весть std::vector переписать? И получить все тотже итератор отличный от указателя. К стати как та собираешься наследоваться от указателя? Ну в быню. Я лучше STL Port возьму.

Sure,

а если хочешь переопределенный укзатель-итератор , то писали про оператор *.
Винтовку добудешь в бою!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.