Почему мой указатель на первый элемент вектора теряется? - PullRequest
0 голосов
/ 17 октября 2019
#include <iostream>
#include <vector>
//#include <string>

struct Point {
    Point(int _x, int _y) {
        x = _x;
        y = _y;
    }

    int x;
    int y;
    Point *parent;
};

int main() {

    Point start(3, 4);
    std::vector<Point> points; 
    points.push_back(start);
    std::cout << points.back().x << "," << points.back().y << "\n";

    Point one(4, 5);
    one.parent = &points.at(0);
    //std::cout <<  "testing: " << one.parent->x << "," << one.parent->y << "\n";
    points.push_back(one);
    std::cout << "One: " << points[1].x << "," << points[1].y << "\n";
    std::cout << "One's parents: " << points[1].parent->x << "," << points[1].parent->y << "\n";

    Point two(10, 3);
    two.parent = &points.back();
    points.push_back(two);
    std::cout << "Two: " << points[2].x << "," << points[2].y << "\n";
    std::cout << "Two's parent: " << points[2].parent->x << "," << points[2].parent->y << "\n";

    Point three(12, 7);
    three.parent = &points[1];
    points.push_back(three);
    std::cout << "Three: " << points[3].x << "," << points[3].y << "\n";
    std::cout << "Three's parents: " << points[3].parent->x << "," << points[3].parent->y << "\n";


    return 1;
}

Я получаю следующие результаты: 3,4 Один: 4,5 Родители одного: 0,0 Два: 10,3 Родителя двух: 4,5 Три: 12,7 Три родителя: 4,5

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

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Хотя MSalters правильно объяснила причину проблемы и возможное решение для этого конкретного случая, общая практика немного отличается. Поскольку vector может быть перераспределен в любой момент, обычно плохая идея хранить указатели на его элементы. Вместо этого вы можете использовать индексы, которые будут действительны независимо от перераспределения;или вы можете рассмотреть возможность использования другой структуры данных, например std::list. Элементы std::list остаются в одном и том же месте всю свою жизнь.

0 голосов
/ 17 октября 2019

std::vector имеет capacity. Если вы добавляете элементы сверх текущей емкости вектора, вектор может решить выделить больший блок, переместить существующие элементы, а затем добавить новые элементы. Это должно было произойти и в вашем случае.

Вы можете увеличить емкость существующего вектора с помощью reserve. Это еще не добавит дополнительные элементы;это просто готовит вектор.

...