Как брать значение вектора по итератору?
От: 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(),
который отлично проверяется пользователем всегда,
как его логика, а не внутреняя.
может ему надо было указатель на начало ?
Винтовку добудешь в бою!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.