Re: Получить итератор элемента vector по индексу ?
От: Dmitry Kotlyarov Россия  
Дата: 13.02.06 12:30
Оценка: -3
Здравствуйте, Аноним, Вы писали:

А>Требуется получить итератор на элемент вектора, то есть, что-то вроде:


А>
vector <data> vec1;
А>vector <data>::iterator itData;
А>...
А>itData = GetItByIndex(Index);


А>Вопрос — как ?



Используй

&v.begin()[Index];

или

&v[Index];
Re[3]: Получить итератор элемента vector по индексу ?
От: Venn Украина  
Дата: 13.02.06 13:04
Оценка: :)
> itData — в примере АТ — неинициализирован.

главное — идею он понял
Posted via RSDN NNTP Server 1.9
Получить итератор элемента vector по индексу ?
От: Аноним  
Дата: 13.02.06 12:08
Оценка:
По ходу туплю товарищи.

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

vec1[Index];


Требуется получить итератор на элемент вектора, то есть, что-то вроде:

vector <data> vec1;
vector <data>::iterator itData;
...
itData = GetItByIndex(Index);


Вопрос — как ?
Или я что-то упустил...

Re: Получить итератор элемента vector по индексу ?
От: Venn Украина  
Дата: 13.02.06 12:10
Оценка:
On Mon, 13 Feb 2006 14:08:31 +0200, wrote:


> [ccode]vector <data> vec1;

> vector <data>::iterator itData;
> ...

itData += Index;
Posted via RSDN NNTP Server 1.9
Re: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 12:11
Оценка:
Здравствуйте, <Аноним>, Вы писали:

vector <data> vec1;
vector <data>::iterator itData;
...
itData = vec1.begin()+Index;
itData = std::advance( begin(), Index );
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: Получить итератор элемента vector по индексу ?
От: ekamaloff Великобритания  
Дата: 13.02.06 12:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Требуется получить итератор на элемент вектора, то есть, что-то вроде:


vector <data>::iterator itData = vec1.begin() + Index;

?
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Получить итератор элемента vector по индексу ?
От: ekamaloff Великобритания  
Дата: 13.02.06 12:13
Оценка:
Здравствуйте, srggal, Вы писали:

S>Здравствуйте, <Аноним>, Вы писали:


S>
S>itData = std::advance( begin(), Index );
S>


Скорее так:

itData = vec1.begin();
std::advance( itData, Index );
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 12:15
Оценка:
Здравствуйте, Venn, Вы писали:

V>On Mon, 13 Feb 2006 14:08:31 +0200, wrote:



>> [ccode]vector <data> vec1;

>> vector <data>::iterator itData;
>> ...

V>itData += Index;


itData — в примере АТ — неинициализирован.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 12:16
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Скорее так:


E>
E>itData = vec1.begin();
E>std::advance( itData, Index );
E>


Конечно именно так.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: Получить итератор элемента vector по индексу ?
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 13.02.06 12:59
Оценка:
Здравствуйте, ekamaloff, Вы писали:

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


S>>Здравствуйте, <Аноним>, Вы писали:


S>>
S>>itData = std::advance( begin(), Index );
S>>


E>Скорее так:


E>
E>itData = vec1.begin();
E>std::advance( itData, Index );
E>


а какая разница? временный объект будет жив до конца полного выражения, в котором он используется, так что ссылка на него будет валидной до выхода из advance
"Что не завершено, не сделано вовсе" Гаусс
Re[4]: Получить итератор элемента vector по индексу ?
От: ekamaloff Великобритания  
Дата: 13.02.06 13:05
Оценка:
Здравствуйте, sadomovalex, Вы писали:

E>>
E>>itData = vec1.begin();
E>>std::advance( itData, Index );
E>>


S>а какая разница? временный объект будет жив до конца полного выражения, в котором он используется, так что ссылка на него будет валидной до выхода из advance


Тут дело немного в другом:

template<class InputIterator, class Distance>
   void advance(
      InputIterator& _InIt, 
      Distance _Off
   );


Первый параметр — итератор, который следует инкрементировать. Возвращаемое значение — void. Делаем выводы.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 13:06
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>а какая разница? временный объект будет жив до конца полного выражения, в котором он используется, так что ссылка на него будет валидной до выхода из advance


Не скомпилится мой вариант, Ибо некорректен.


template<class InputIterator, class Distance>
   void advance(
      InputIterator& _InIt, 
      Distance _Off
   );
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: Получить итератор элемента vector по индексу ?
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 13.02.06 13:17
Оценка:
Здравствуйте, ekamaloff, Вы писали:

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


E>>>
E>>>itData = vec1.begin();
E>>>std::advance( itData, Index );
E>>>


S>>а какая разница? временный объект будет жив до конца полного выражения, в котором он используется, так что ссылка на него будет валидной до выхода из advance


E>Тут дело немного в другом:


E>
E>template<class InputIterator, class Distance>
E>   void advance(
E>      InputIterator& _InIt, 
E>      Distance _Off
E>   );
E>


E>Первый параметр — итератор, который следует инкрементировать. Возвращаемое значение — void. Делаем выводы.


и точно..
"Что не завершено, не сделано вовсе" Гаусс
Re[6]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 13:25
Оценка:
Здравствуйте, sadomovalex, Вы писали:

Юзал advance и не задумывался, а почему он не возвращает ссылку на итератор, а вот ошибся, и задумался, рационального ответа так и не нашел, все только на уровне — "Исторически так сложилось".
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[7]: Получить итератор элемента vector по индексу ?
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 13.02.06 13:46
Оценка:
Здравствуйте, srggal, Вы писали:

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


S>Юзал advance и не задумывался, а почему он не возвращает ссылку на итератор, а вот ошибся, и задумался, рационального ответа так и не нашел, все только на уровне — "Исторически так сложилось".


наверное для того, чтобы не создавать дополнительных временных объектов
"Что не завершено, не сделано вовсе" Гаусс
Re[8]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 13:49
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>наверное для того, чтобы не создавать дополнительных временных объектов


Я грил о возврате аргумента (по ссылке) первого аргумент.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[9]: Получить итератор элемента vector по индексу ?
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 13.02.06 13:58
Оценка:
Здравствуйте, srggal, Вы писали:

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


S>>наверное для того, чтобы не создавать дополнительных временных объектов


S>Я грил о возврате аргумента (по ссылке) первого аргумент.


т.е. просто добавить в advance return ?
"Что не завершено, не сделано вовсе" Гаусс
Re[10]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 14:04
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>т.е. просто добавить в advance return ?


Да, именно об этом я и грю.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[11]: Получить итератор элемента vector по индексу ?
От: kan_izh Великобритания  
Дата: 13.02.06 14:40
Оценка:
srggal wrote:

> S>т.е. просто добавить в advance return ?

> Да, именно об этом я и грю.
Видимо, чтобы избежать след. граблей:
const_iterator current = ...;
const_iterator next = advance(current, 1);

if(*current != *next)
{
...
}
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[12]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 14:50
Оценка:
Здравствуйте, kan_izh, Вы писали:


Для меня это не рациональный ответ, ибо такая "забота" о пользователях итераторов никоим образом не согласуется с тем, что во многих случаях пользователь итераторов должен быть внимателен дабы не насиупить на грабли:
— *end();
— std::find( cont1.begin(), cont2.end() );
— etc.

Кроме того:
const_iterator current = cont.begin();
const_iterator next; 
std::advance(next, 0);

if(*current != *next)
{
...
}


ЗЫ и Ваш и мой пример притянуты за очень длинные уши
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: Получить итератор элемента vector по индексу ?
От: Init64  
Дата: 13.02.06 15:22
Оценка:
Здравствуйте, Dmitry Kotlyarov, Вы писали:

DK>Здравствуйте, Аноним, Вы писали:


А>>Требуется получить итератор на элемент вектора, то есть, что-то вроде:


А>>
vector <data> vec1;
А>>vector <data>::iterator itData;
А>>...
А>>itData = GetItByIndex(Index);


А>>Вопрос — как ?



DK>Используй


DK>
DK>&v.begin()[Index];
DK>

DK>или

DK>
DK>&v[Index];
DK>


Альтернативный вариант:



// получаем ссылку на сам элемент вектора
data& dataValue = vec1.at(index);
Re[11]: Получить итератор элемента vector по индексу ?
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 13.02.06 15:31
Оценка:
Здравствуйте, srggal, Вы писали:

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


S>>т.е. просто добавить в advance return ?


S>Да, именно об этом я и грю.


для меня это существенным образом не изменило бы картину.. было б удобно использовать такой синтаксис:
list<int>::iterator it = std::advance(l.begin(), n);

но здесь без временных объектов не обошлось бы
"Что не завершено, не сделано вовсе" Гаусс
Re[12]: Получить итератор элемента vector по индексу ?
От: Venn Украина  
Дата: 13.02.06 15:37
Оценка:
On Mon, 13 Feb 2006 17:31:58 +0200, sadomovalex <28937@users.rsdn.ru>
wrote:

> list<int>::iterator it = std::advance(l.begin(), n);


для этого используется
list<int>::iterator it = l.begin() + n;
Posted via RSDN NNTP Server 1.9
Re[12]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 15:43
Оценка:
Здравствуйте, sadomovalex, Вы писали:


S>для меня это существенным образом не изменило бы картину.. было б удобно использовать такой синтаксис:

S>
S>list<int>::iterator it = std::advance(l.begin(), n);
S>

S>но здесь без временных объектов не обошлось бы

Дык в данном случае возможна оптимизация компилятором и то, на то и получится.

Ваш пример можно чуть усложнить:
if ( l.size() > n  )
{
    std::for_each( std::advance(l.begin(), n), l.end(), op );
}
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[13]: Получить итератор элемента vector по индексу ?
От: Аноним  
Дата: 13.02.06 17:20
Оценка:
Здравствуйте, Venn, Вы писали:

V>On Mon, 13 Feb 2006 17:31:58 +0200, sadomovalex <28937@users.rsdn.ru>

V>wrote:

>> list<int>::iterator it = std::advance(l.begin(), n);


V>для этого используется

V>list<int>::iterator it = l.begin() + n;

попробуйте скомпилить это
Re[2]: Получить итератор элемента vector по индексу ?
От: Кодт Россия  
Дата: 13.02.06 17:23
Оценка:
Здравствуйте, Dmitry Kotlyarov, Вы писали:

Ты исходишь из допущения, что std::vector<T>::iterator — это T*. Это, в общем случае, несправедливо. (Например, отладочная версия STLPort).

DK>Используй

DK>&v.begin()[Index];

У итератора нет operator[].
DK>или
DK>&v[Index];

А это — просто указатель на Index'ый элемент вектора.
Перекуём баги на фичи!
Re[13]: Получить итератор элемента vector по индексу ?
От: kan_izh Великобритания  
Дата: 13.02.06 17:26
Оценка:
Venn wrote:
> для этого используется
> list<int>::iterator it = l.begin() + n;
+ только для random access iterators.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[13]: Получить итератор элемента vector по индексу ?
От: kan_izh Великобритания  
Дата: 13.02.06 17:33
Оценка:
srggal wrote:

> Для меня это не рациональный ответ, ибо такая "забота" о пользователях

> итераторов никоим образом не согласуется с тем, что во многих случаях
> пользователь итераторов должен быть внимателен дабы не насиупить на грабли:
> — *end();
Извини, это не грабли, это концептуальное понятие end-итератора. Иначе было бы большим извращением задавать пустые
интервалы.
Ты же не считаешь граблями a[size_of_array_a]?

> — std::find( cont1.begin(), cont2.end() );

Это да... range не хватает.

> Кроме того:

>
> const_iterator current = cont.begin();
> const_iterator next;
> std::advance(next, 0);
>
> if(*current != *next)
> {
> ...
> }
Не заметить то, что здесь не инициализируется переменная куда проще, чем отстутствие const у первого аргумента advance.
Тем более у меня часто руки чесались писать код, который я приводил, но получал по рукам от компилера.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[14]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 17:40
Оценка:
Здравствуйте, kan_izh, Вы писали:

_>Извини, это не грабли, это концептуальное понятие end-итератора. Иначе было бы большим извращением задавать пустые

_>интервалы.
_>Ты же не считаешь граблями a[size_of_array_a]?

>> — std::find( cont1.begin(), cont2.end() );

_>Это да... range не хватает.

Я и имел в виду, что концептуально — итераторы не безопасты. И приведенный пример — не идет в разрез с концептуальной опасностью итераторов.
... << RSDN@Home 1.1.4 stable rev. 510>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.