#c #arrays #pointers #vector #2d
Вопрос:
template<class T>
struct Edges{
T u,v;
int w;
};
int main(int argc, char const *argv[]){
vector<struct Edges<int>> *ptr = new vector<struct Edges<int>>(
{{1,2,1},{1,3,1}, {2,3,1}}
);
// access individual elements from the 2d pointer
return 0;
}
Как получить доступ к отдельным элементам из ptr
указателя? Я попытался получить к нему доступ с помощью ptr[0]->u
, но он показывает ошибку времени компиляции base operand of ‘->’ has non-pointer type ‘std::vector<Edges<int> >’
Комментарии:
1. У вас нет 2d-массива или вектора. У вас есть 1d массив
Edges
.
Ответ №1:
У вас есть указатель на один std::vector
объект, а не на массив std::vector
s. Вы рассматриваете этот указатель так, как если бы он указывал на массив, которым он не является (ну, технически, любой объект можно рассматривать как массив из 1 элемента).
ptr[0]
это то же *(ptr 0)
самое , что и ie *ptr
, таким образом, разыменование этого указателя приведет к доступу к std::vector
самому элементу, а не к его 1-му элементу. Если бы вы попытались использовать более высокий индекс ptr[1]
, то есть , вы получили бы доступ за пределы этого единственного std::vector
, что является неопределенным поведением.
std::vector
не имеет ->
оператора, поэтому ptr[0]->
не удается скомпилировать.
Но, даже если бы вы правильно обращались к 1 std::vector
-му элементу, ->
все равно было бы неправильно использовать, так std::vector
как он не содержит Edge*
указателей для своих элементов. Он содержит фактические Edge
объекты, поэтому вместо этого вам нужно будет использовать .
оператор для доступа к полям каждого Edge
из них .
Вместо этого вам нужно будет использовать следующий синтаксис для доступа к отдельным полям каждого Edge
из них с std::vector
помощью указателя:
(*ptr)[element_index].field
Например:
int main(){
vector<Edges<int>> *ptr = new vector<Edges<int>>(
{{1,2,1},{1,3,1}, {2,3,1}}
);
// access individual elements from the vector
for (size_t i = 0; i < ptr->size(); i)
cout << (*ptr)[i].u << ' ';
delete ptr;
return 0;
}
Но почему вы new
вообще так используете? std::vector
содержит динамически выделенный массив, поэтому нет необходимости std::vector
также динамически создавать сам массив. Это необычно для new
любого стандартного контейнера C . Например:
int main(){
vector<Edges<int>> vec(
{{1,2,1},{1,3,1}, {2,3,1}}
);
// access individual elements from the vector, eg
for (size_t i = 0; i < vec.size(); i)
cout << vec[i].u << ' ';
return 0;
}