Как получить доступ к отдельным элементам из указателя векторного типа 2d в c

#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;
}
 

Онлайн-Демонстрация