Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

как обратиться к произвольному элементу вектора? (stl)

1.3K
14 апреля 2005 года
zja
119 / / 25.11.2003
vector<Shapka> Shapki;
обратиться к первому
Shapki.begin();
обратиться к последнему
Shapki.end();
а как обратиться к произвольному?
тип итератора вроде вот так задается:
typedef vector<Shapka>::const_iterator Sh;
но потом надо определить саму переменную и наполнить ее собственно, на примере это делается:
for(Sh i=Shapki.begin();i!=Shapki.end();++i)
{....}
а как загнать не первое, не последнее а какое-нибудь 20-е значение и как в лоб обратиться к 20-му элементу(как кстати попутно проверить что он есть вообще), я сначала увидел этот ++i обрадовался как ребенок, подумал - це ж int или вроде того, ан нет, размерность этого i совсем другая, собственно говоря вообще каждый раз разная))))
3
14 апреля 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by zja

а как загнать не первое, не последнее а какое-нибудь 20-е значение


изменить размер вектора до необходимого (resize),
занести значение, получив ссылку на элемент разындексированием:
Shapki[19] = val;

Цитата:
Originally posted by zja

и как в лоб обратиться к 20-му элементу


Разындексированием: Shapki[19]

Цитата:
Originally posted by zja

(как кстати попутно проверить что он есть вообще)


Запросить размер: Shapki.size()

Цитата:
Originally posted by zja

я сначала увидел этот ++i обрадовался как ребенок, подумал - це ж int или вроде того, ан нет, размерность этого i совсем другая, собственно говоря вообще каждый раз разная))))


А вот тут ты бред несешь, уважаемый.

P.S. "Учите мат.часть!"
Разберись что есть vector и чем он отличается от других контейнеров, от list например.

1.3K
14 апреля 2005 года
zja
119 / / 25.11.2003
дык учимся, насчет размерности я оговорился, я так понимаю что i это просто указатель, а вот куски памяти на которые он указывает могут быть совершенно разные в зависимости от того что мы понимаем под Shapka. я правильно мыслю?
а на счет отличий вектора от листа... ну к вектору можно обратиться по индексу, а к листу вроде как нет.. на самом деле я так понял у всех контейнров много общего просто каждый что-то одно лучше делает
3
14 апреля 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by zja
я так понимаю что i это просто указатель, а вот куски памяти на которые он указывает могут быть совершенно разные в зависимости от того что мы понимаем под Shapka. я правильно мыслю?


В твоем примере i - это итератор, причем константный.
Итератор - это не указатель, хотя в чем то он на него похож, а именно - определенными в классе итератора опрераторами разыменования (звездочка и стрелочка). Но в отличие от указателя он не указывает на область памяти, а операция разыменования более сложная, чем у простого указателя.

Цитата:
Originally posted by zja
а на счет отличий вектора от листа... ну к вектору можно обратиться по индексу, а к листу вроде как нет.. на самом деле я так понял у всех контейнров много общего просто каждый что-то одно лучше делает


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

1.3K
17 апреля 2005 года
zja
119 / / 25.11.2003
а вот такой вопрос, во всех доках и в хелпе включительно вектора вызываются если есть следующая строчка
#include <vector>
а у меня вот только так работает:
#include <vector.h>
и кажется всеравно работает криво, но уже ввиду рук, проверяю значения внутри вектора, а там такая фигня, вообще отстой какой-то, такое ощущение что отовсюду из разных мест программы и вообще системы кусков надергали и в вектор запихнули, т.е. может 1,2 строчки правильно читаются, а потом начинается что-то совсем не то, может вектора, листы и мапы вообще не предполагается использовать в bcb, но это тоже вроде глупость какая-то
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  vector<char*> Qwe;
  Qwe.clear();
  Database1->Connected=true;
  Query1->Active=true;
  Query1->First();
  while(!Query1->Eof)
  {
    Qwe.push_back(Query1->Fields->operator [](0)->AsString.c_str());
    Query1->Next();
  }
  Query1->Active=false;
  Database1->Connected=false;
  typedef vector<char*>::iterator CI;
  int j=1;
  for(CI i=Qwe.begin();i!=Qwe.end();i++)
  {
    StringGrid1->Cells[0][j]=IntToStr(i);
    StringGrid1->Cells[1][j]=AnsiString(*i);
    j++;
    StringGrid1->RowCount++;
  }
}

данный пример выводит всего 1но полученное поле из запроса к бд, да и то выводит криво, в чем ошибка? и i всегда равно 1-це
310
18 апреля 2005 года
fellow
853 / / 17.03.2003
Смешались в кучу кони, люди.... :)
Метод c_str() возвращает указатель на символьный массив, действительный лишь до следующего оператора. Об этом и в справке написано. Если есть желание мучиться с вектором указателей на символы (vector<char*>), то ради бога, но в таком случае обязательно делайте полную копию возвращаемого c_str() буфера и указатель на него кладите в вектор. Хотя есть и лучший способ - использовать вектор строк (vector<string>) или вектор AnsiString.
И зачем этот изврат: typedef vector<char*>::iterator CI; ? Неужели нельзя просто объявить переменную i и присвоить ей значение: vector<char*>::iterator i=Qwe.begin();?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог