2009-03-07 3 views
2

Как бы получить переменные из вектора?Как я могу получить доступ к переменным в векторе <struct> * obj?

Я не могу использовать бинарные операторы вставки или равные операторы.

Ранее я объявил vector<someStruct> *vObj и выделил его, а затем вернулся vObj и назвал его в этой функции:

vector<sameStruct> firstFunc(); 

for (unsigned int x = 0; x < v->size(); x++) 
{ 
    v[x]; 
} 

, когда я его отладки, v[x] теперь имеет полное содержимое исходного вектора, а он делал это раньше без индекса/индекса.

Но я не думаю, что я сделал что-либо, чтобы продвинуться дальше этого.

У меня только около 4 переменных внутри моего вектора; когда я его отлаживаю, у него есть информация, которая мне нужна, но я не могу добраться до нее.

ответ

2

Как написано v является указателем на вектор структур.

При индексировании непосредственно в v все, что вы делаете, является указателем арифметическим. v [x] - вектор структур в позиции x (предполагая, что v является массивом, если это только один объект в конце указателя, тогда v [x] для x> 0 - просто мусор). Это происходит потому, что он применяет [x] не к вектору, на который указывает v, но и самому указателю v.

Вы должны разыменованиями указателя, а затем индекс в вектор, используя что-то вроде:

(*v)[x]; 

На данный момент у вас есть ссылка на объект на ое положении вектора, чтобы получить на своих функциях членов/переменные используют:

(*v)[x].variable; 

или

(*v)[x].memberfunction(parameters); 

Если d О не хочу разыменовать вектор затем получить доступ к элементу в нем вы можете попробовать что-то вроде:

v->at(x); 
v->at(x).variable; 
v->at(x).memberfunction; 

Таким образом, вы получаете доступ к функции-члена объекта точно таким же образом, как когда вы называли:

v->size(); 

Я надеюсь, что это поможет.

1

Чтобы использовать оператор [] для доступа к элементам, вы должны сделать это на объекте, а не на указатель на объект.

Попробуйте;

(*vec)[x]; 

E.g.

for (int i = 0; i < vec->size(); i++) 
{ 
    printf("Value at %d is %d\n", i, (*vec)[i]); 
} 

Обратите внимание, что при вызове функции по указателю вы обычно используете - оператор вместо >., но вы можете легко сделать (* vec) .some_func(); вместо.

Операторы, такие как [], -, ++ и т. Д. Могут действовать как на объекты, так и указатели. С объектами они действуют как вызовы функций, но по указателям они действуют как математические операции по адресу.

Например,

pointer[nth]; 
*(pointer + nth); 

Имейте точно такой же эффект - они возвращают n-й объект с начала указателя. (Обратите внимание на расположение * во втором примере, это называется после смещения применяются

Две других советами,.

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

void my_func(std::vector<int>& vector) 
{ 
    // vector can then be used as a regular variable 
} 

Если вы собираетесь проездом векторов определенного типа для функций много, то вы можете использовать ЬурейиЙ как для ясности, так и для сохранения при наборе текста.

typedef std::vector<int> IntVector; 

void my_func(IntVector& vector) 
{ 
} 
Смежные вопросы