как обратиться к произвольному элементу вектора? (stl)
обратиться к первому
Shapki.begin();
обратиться к последнему
Shapki.end();
а как обратиться к произвольному?
тип итератора вроде вот так задается:
typedef vector<Shapka>::const_iterator Sh;
но потом надо определить саму переменную и наполнить ее собственно, на примере это делается:
for(Sh i=Shapki.begin();i!=Shapki.end();++i)
{....}
а как загнать не первое, не последнее а какое-нибудь 20-е значение и как в лоб обратиться к 20-му элементу(как кстати попутно проверить что он есть вообще), я сначала увидел этот ++i обрадовался как ребенок, подумал - це ж int или вроде того, ан нет, размерность этого i совсем другая, собственно говоря вообще каждый раз разная))))
а как загнать не первое, не последнее а какое-нибудь 20-е значение
изменить размер вектора до необходимого (resize),
занести значение, получив ссылку на элемент разындексированием:
Shapki[19] = val;
и как в лоб обратиться к 20-му элементу
Разындексированием: Shapki[19]
(как кстати попутно проверить что он есть вообще)
Запросить размер: Shapki.size()
я сначала увидел этот ++i обрадовался как ребенок, подумал - це ж int или вроде того, ан нет, размерность этого i совсем другая, собственно говоря вообще каждый раз разная))))
А вот тут ты бред несешь, уважаемый.
P.S. "Учите мат.часть!"
Разберись что есть vector и чем он отличается от других контейнеров, от list например.
а на счет отличий вектора от листа... ну к вектору можно обратиться по индексу, а к листу вроде как нет.. на самом деле я так понял у всех контейнров много общего просто каждый что-то одно лучше делает
я так понимаю что i это просто указатель, а вот куски памяти на которые он указывает могут быть совершенно разные в зависимости от того что мы понимаем под Shapka. я правильно мыслю?
В твоем примере i - это итератор, причем константный.
Итератор - это не указатель, хотя в чем то он на него похож, а именно - определенными в классе итератора опрераторами разыменования (звездочка и стрелочка). Но в отличие от указателя он не указывает на область памяти, а операция разыменования более сложная, чем у простого указателя.
а на счет отличий вектора от листа... ну к вектору можно обратиться по индексу, а к листу вроде как нет.. на самом деле я так понял у всех контейнров много общего просто каждый что-то одно лучше делает
У всех контейнеров одно назначение - хранить однотипные данные, а так же выполнять над этими данными типовые действия (добавление, извлечение, сортировка и т.п.).
Ну а различаются они способом хранения и в некоторых случаях способом доступа, точнее наличием дополнительных способов доступа, как например разындексирование у вектора, которого, как ты правильно заметил, нет у листа.
Но основное различие между вектором, листом, мепом все же в другом - в способе хранения данных.
#include <vector>
а у меня вот только так работает:
#include <vector.h>
и кажется всеравно работает криво, но уже ввиду рук, проверяю значения внутри вектора, а там такая фигня, вообще отстой какой-то, такое ощущение что отовсюду из разных мест программы и вообще системы кусков надергали и в вектор запихнули, т.е. может 1,2 строчки правильно читаются, а потом начинается что-то совсем не то, может вектора, листы и мапы вообще не предполагается использовать в bcb, но это тоже вроде глупость какая-то
{
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-це
Метод c_str() возвращает указатель на символьный массив, действительный лишь до следующего оператора. Об этом и в справке написано. Если есть желание мучиться с вектором указателей на символы (vector<char*>), то ради бога, но в таком случае обязательно делайте полную копию возвращаемого c_str() буфера и указатель на него кладите в вектор. Хотя есть и лучший способ - использовать вектор строк (vector<string>) или вектор AnsiString.
И зачем этот изврат: typedef vector<char*>::iterator CI; ? Неужели нельзя просто объявить переменную i и присвоить ей значение: vector<char*>::iterator i=Qwe.begin();?