std::vector
От: Аноним  
Дата: 15.09.04 08:51
Оценка:
Имеется вектор, забитый указателями на объект одного класса. В одной из функции я хочу вернуть указатель на 7-й элемент этого вектора, в вызывающую функцию и уже в ней обращаться с помощью адресной арифметики к элементам (указателям) вектора, расположенным за 7-м элементом. Возможно ли такое? Если бы был просто массив указателей — arr[200], я бы вернул arr, и уже работал бы так arr + 8... arr + 9 . Спасибо
Re: std::vector
От: korzhik Россия  
Дата: 15.09.04 08:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Имеется вектор, забитый указателями на объект одного класса. В одной из функции я хочу вернуть указатель на 7-й элемент этого вектора, в вызывающую функцию и уже в ней обращаться с помощью адресной арифметики к элементам (указателям) вектора, расположенным за 7-м элементом. Возможно ли такое? Если бы был просто массив указателей — arr[200], я бы вернул arr, и уже работал бы так arr + 8... arr + 9 . Спасибо


возможно.
vector как раз и задумывался как замена обычному массиву.

только зачем извращаться так?
передавай итератор.
Re[2]: std::vector
От: Аноним  
Дата: 15.09.04 09:01
Оценка:
Здравствуйте, korzhik, Вы писали:

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


А>>Имеется вектор, забитый указателями на объект одного класса. В одной из функции я хочу вернуть указатель на 7-й элемент этого вектора, в вызывающую функцию и уже в ней обращаться с помощью адресной арифметики к элементам (указателям) вектора, расположенным за 7-м элементом. Возможно ли такое? Если бы был просто массив указателей — arr[200], я бы вернул arr, и уже работал бы так arr + 8... arr + 9 . Спасибо


K>возможно.

K>vector как раз и задумывался как замена обычному массиву.

K>только зачем извращаться так?

K>передавай итератор.

В смысле я могу сделать так: vectorObj + 7, а если двумерный, да еще невыровненный???
Re[3]: std::vector
От: korzhik Россия  
Дата: 15.09.04 09:11
Оценка:
Здравствуйте, Аноним, Вы писали:

K>>возможно.

K>>vector как раз и задумывался как замена обычному массиву.

K>>только зачем извращаться так?

K>>передавай итератор.

А>В смысле я могу сделать так: vectorObj + 7, а если двумерный, да еще невыровненный???


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

во первых что такое vectorObj?

ну ладно ругаться больше не буду, а лучше достану свой хрустальный шар и немного потелепатирую...
а вот теперь вижу, что vectorObj это std::vector<MyClass*> vectorObj
Теперь отвечаю: вот так vectorObj + 7 делать нельзя, можно так:
*(&vectorObj[0] + 7)

а надо так:
*(vectorObj.begin() + 7)


Встречный вопрос: слово итератор тебе знакомо?
Re: std::vector
От: Bell Россия  
Дата: 15.09.04 09:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Имеется вектор, забитый указателями на объект одного класса. В одной из функции я хочу вернуть указатель на 7-й элемент этого вектора, в вызывающую функцию и уже в ней обращаться с помощью адресной арифметики к элементам (указателям) вектора, расположенным за 7-м элементом. Возможно ли такое? Если бы был просто массив указателей — arr[200], я бы вернул arr, и уже работал бы так arr + 8... arr + 9 . Спасибо


std::vector хранит свои элементы в непрерывном блоке памяти. Адрес первого элемента можно получить так:

std::vector<int> arr;
...
int* ptr = &arr[0];
или
int* ptr = &arr.front();
или
int* ptr = &(*arr.begin());

ptr[i] = ...;
Любите книгу — источник знаний (с) М.Горький
Re[4]: std::vector
От: Аноним  
Дата: 15.09.04 09:37
Оценка:
Здравствуйте, korzhik, Вы писали:

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


K>>>возможно.

K>>>vector как раз и задумывался как замена обычному массиву.

K>>>только зачем извращаться так?

K>>>передавай итератор.

А>>В смысле я могу сделать так: vectorObj + 7, а если двумерный, да еще невыровненный???


K>ну ты даёшь! задаёшь вопрос про одно, а потом оказывается что уже всё изменилось.


K>во первых что такое vectorObj?


K>ну ладно ругаться больше не буду, а лучше достану свой хрустальный шар и немного потелепатирую...

K>а вот теперь вижу, что vectorObj это std::vector<MyClass*> vectorObj
K>Теперь отвечаю: вот так vectorObj + 7 делать нельзя, можно так:
K>
K>*(&vectorObj[0] + 7)
K>

K>а надо так:
K>
K>*(vectorObj.begin() + 7)
K>


K>Встречный вопрос: слово итератор тебе знакомо?

Только знакомо, сам не работал и не представляю как. Научи
Re[4]: std::vector
От: Аноним  
Дата: 15.09.04 09:39
Оценка:
Здравствуйте, korzhik, Вы писали:

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


K>>>возможно.

K>>>vector как раз и задумывался как замена обычному массиву.

K>>>только зачем извращаться так?

K>>>передавай итератор.

А>>В смысле я могу сделать так: vectorObj + 7, а если двумерный, да еще невыровненный???


K>ну ты даёшь! задаёшь вопрос про одно, а потом оказывается что уже всё изменилось.


K>во первых что такое vectorObj?


K>ну ладно ругаться больше не буду, а лучше достану свой хрустальный шар и немного потелепатирую...

K>а вот теперь вижу, что vectorObj это std::vector<MyClass*> vectorObj
K>Теперь отвечаю: вот так vectorObj + 7 делать нельзя, можно так:
K>
K>*(&vectorObj[0] + 7)
K>

K>а надо так:
K>
K>*(vectorObj.begin() + 7)
K>


K>Встречный вопрос: слово итератор тебе знакомо?

На самом деле вектор двумерный, да еще невыровненный.
Re[5]: std::vector
От: korzhik Россия  
Дата: 15.09.04 09:51
Оценка:
Здравствуйте, Аноним, Вы писали:

K>>Встречный вопрос: слово итератор тебе знакомо?

А>Только знакомо, сам не работал и не представляю как. Научи

ну в общем итератор это обобщённый указатель.
служит для того чтобы перебирать элементы какой-нибудь последовательности.
Более подробно нет времени объяснять, читай книги по STL и паттернам программирования.

применительно к контейнерам STL и в частности к std::vector:

есть два метода begin() и end(), которые возвращают итераторы.
begin() возвращает итератор на первый элемент последовательности
end() возвращает итератор на место следующее сразу за последним элементом.
пример:
  std::vector<int> arr;
  
  for (int i = 0; i < 5; ++i)
  {
    arr.push_back(i);
  }

имеем такую ситуацию:
     arr: 1, 2, 3, 4 ^
          ^          |
          |          |
arr.begin()  arr.end()


то есть мы можем пройтись по нашей последовательности с помощью итераторов:
  std::vector<int>::iterator it    = arr.begin();
  std::vector<int>::iterator last  = arr.end();

  for (; it != last; ++it)
  {
    std::cout << *it << std::endl;
  }


итераторы бывают разных категорий (подробнее в книгах)
у vectora итератор произвольного доступа, то есть ты можешь делать так:
  std::vector<int>::iterator it = arr.begin();

  std::cout << *(it + 7) << std::endl;
Re[5]: std::vector
От: Анатолий Широков СССР  
Дата: 15.09.04 09:54
Оценка:
А>На самом деле вектор двумерный, да еще невыровненный.

У вас примерно такая структура std::vector<myobject*> vec?

Если да, то тогда, чтобы работать с 7 строкой матрицы используйте vec[6]. А для обращения к элементам строки vec[6][0] и т.д.

В противном случае, проясните ситуацию.
Re[5]: std::vector
От: _nn_  
Дата: 15.09.04 09:57
Оценка:
Здравствуйте, Аноним, Вы писали:

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


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


K>>>>возможно.

K>>>>vector как раз и задумывался как замена обычному массиву.

K>>>>только зачем извращаться так?

K>>>>передавай итератор.

А>>>В смысле я могу сделать так: vectorObj + 7, а если двумерный, да еще невыровненный???


K>>ну ты даёшь! задаёшь вопрос про одно, а потом оказывается что уже всё изменилось.


K>>во первых что такое vectorObj?


K>>ну ладно ругаться больше не буду, а лучше достану свой хрустальный шар и немного потелепатирую...

K>>а вот теперь вижу, что vectorObj это std::vector<MyClass*> vectorObj
K>>Теперь отвечаю: вот так vectorObj + 7 делать нельзя, можно так:
K>>
K>>*(&vectorObj[0] + 7)
K>>

K>>а надо так:
K>>
K>>*(vectorObj.begin() + 7)
K>>


K>>Встречный вопрос: слово итератор тебе знакомо?

А>Только знакомо, сам не работал и не представляю как. Научи

Почитать можно еще много чего здесь
Автор(ы): Александр Степанов, Менг Ли
.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: std::vector
От: Аноним  
Дата: 15.09.04 10:00
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

А>>На самом деле вектор двумерный, да еще невыровненный.


АШ>У вас примерно такая структура std::vector<myobject*> vec?


АШ>Если да, то тогда, чтобы работать с 7 строкой матрицы используйте vec[6]. А для обращения к элементам строки vec[6][0] и т.д.


АШ>В противном случае, проясните ситуацию.


Вы правильно меня поняли (извиняюсь, если ввел в заблуждение, надо было мне сразу писать все как есть)! Нужно получить указатель на начало 6 строки двумерного вектора и уже после перебрать все столбцы в этой 6-й строке
Re[7]: std::vector
От: Аноним  
Дата: 15.09.04 10:03
Оценка:
Здравствуйте, Аноним, Вы писали:

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


А>>>На самом деле вектор двумерный, да еще невыровненный.


АШ>>У вас примерно такая структура std::vector<myobject*> vec?


АШ>>Если да, то тогда, чтобы работать с 7 строкой матрицы используйте vec[6]. А для обращения к элементам строки vec[6][0] и т.д.


АШ>>В противном случае, проясните ситуацию.


А>Вы правильно меня поняли (извиняюсь, если ввел в заблуждение, надо было мне сразу писать все как есть)! Нужно получить указатель на начало 6 строки двумерного вектора и уже после перебрать все столбцы в этой 6-й строке


Нужно видимо так Obj *myobj = &vector[6][0], далее myobj + 1, + 2, до конца строки. Правильно
Re[7]: std::vector
От: Анатолий Широков СССР  
Дата: 15.09.04 10:05
Оценка:
А>Вы правильно меня поняли (извиняюсь, если ввел в заблуждение, надо было мне сразу писать все как есть)! Нужно получить указатель на начало 6 строки двумерного вектора и уже после перебрать все столбцы в этой 6-й строке

Так понятно:
std::vector<myobject*> vec = ...;

for(size_t i = 0; i < row_count; i++)
for(size_t j = 0; j < col_count; j++)
    vec[i][j] = ...;

?
Re[7]: std::vector
От: Bell Россия  
Дата: 15.09.04 10:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вы правильно меня поняли (извиняюсь, если ввел в заблуждение, надо было мне сразу писать все как есть)!


Да, если правильно описать проблему, то решение находится гораздо быстрее

А>Нужно получить указатель на начало 6 строки двумерного вектора и уже после перебрать все столбцы в этой 6-й строке



std::vector<std::vector<int> > arr2d;
...
int* pRow6 = &arr2d[6][0];
или
int* pRow6 = &(*arr2d[6].begin());
или
int* pRow6 = &arr2d[6].front();
Любите книгу — источник знаний (с) М.Горький
Re[8]: std::vector
От: Анатолий Широков СССР  
Дата: 15.09.04 10:13
Оценка:
А>Нужно видимо так Obj *myobj = &vector[6][0], далее myobj + 1, + 2, до конца строки. Правильно

Можно проще:

Obj *myobj = vector[6];


А далее myobj + 1, + 2
Re[9]: std::vector
От: Bell Россия  
Дата: 15.09.04 10:17
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

А>>Нужно видимо так Obj *myobj = &vector[6][0], далее myobj + 1, + 2, до конца строки. Правильно


АШ>Можно проще:


АШ>
АШ>Obj *myobj = vector[6];
АШ>


АШ>А далее myobj + 1, + 2


По-моему все окончательно запутались
Насколько я понимаю ситуацию, имеется
std::vector<std::vector<Obj*> > vec;


и поэтому "обычный" указатель на строку нужно получать так:
Obj** ptr = &vec[6][0];


хотя я сам уже ни в чем не уверен...
Любите книгу — источник знаний (с) М.Горький
Re[8]: std::vector
От: kvas Россия  
Дата: 15.09.04 10:22
Оценка:
Здравствуйте, Bell, Вы писали:

B>
B>std::vector<std::vector<int> > arr2d;
B>...
B>int* pRow6 = &arr2d[6][0];
B>или
B>int* pRow6 = &(*arr2d[6].begin());
B>или
B>int* pRow6 = &arr2d[6].front();
B>


Ага, только у него вроде массив указателей, т.е. что-то вроде


std::vector<std::vector<Foo*> > arr2d(10, std::vector<Foo*>(10));
//здесь как-то инициализируем указатели
Foo **p = &a[6][0];


Что, впрочем, сути не меняет
Re[10]: std::vector
От: Анатолий Широков СССР  
Дата: 15.09.04 10:23
Оценка:
B>хотя я сам уже ни в чем не уверен...

Я основывался на ответе: http://www.rsdn.ru/Forum/Message.aspx?mid=809459&amp;only=1
Автор:
Дата: 15.09.04


И вроде автор подтвердил, что имеем дело с std::vector<myobject*>, но а там кто его знает
Re[9]: std::vector
От: Аноним  
Дата: 15.09.04 10:25
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

А>>Нужно видимо так Obj *myobj = &vector[6][0], далее myobj + 1, + 2, до конца строки. Правильно


АШ>Можно проще:


АШ>
АШ>Obj *myobj = vector[6];
АШ>


АШ>А далее myobj + 1, + 2

Спасибо
Re[9]: std::vector
От: Аноним  
Дата: 15.09.04 10:26
Оценка:
Здравствуйте, kvas, Вы писали:

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


B>>
B>>std::vector<std::vector<int> > arr2d;
B>>...
B>>int* pRow6 = &arr2d[6][0];
B>>или
B>>int* pRow6 = &(*arr2d[6].begin());
B>>или
B>>int* pRow6 = &arr2d[6].front();
B>>


K>Ага, только у него вроде массив указателей, т.е. что-то вроде



K>
K>std::vector<std::vector<Foo*> > arr2d(10, std::vector<Foo*>(10));
K>//здесь как-то инициализируем указатели
K>Foo **p = &a[6][0];
K>


K>Что, впрочем, сути не меняет

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.