vector :: push_back и доступ к значениям в Vector Pointer в C ++ - PullRequest
1 голос
/ 03 февраля 2012

Редактировать: На следующий вопрос ответил this . У меня есть новый обновленный вопрос, является ли это более эффективным для использования: (мой друг сказал, что неэффективно помещать вектор вектора, потому что он использует последовательную память, и перераспределять, когда вы push_back означает, что требуется больше времени, чтобы найти место, где кусок памяти для всего большого вектора может быть размещен)

(где Picture - вектор линий, Line - вектор точек)

std::vector<Point> *LineVec;
std::vector<Line> PictureVec;

versus

std::vector<Point> LineVec;
std::vector<Line> PictureVec;


struct Point{
    int x;
    int y;
}

Я пытаюсь получить вектор вектора, и мой друг сказал мне, что неэффективно помещать вектор вектора, потому что он использует последовательную память, а вектор вектора будет занимать огромное количество места. Поэтому он предложил использовать вектор указателя-вектора. Поэтому внутренний вектор выглядит следующим образом. Очевидно, я очень плохо знаком с C ++ и был бы признателен за любые идеи.

struct Shape{
    int c;
    int d;
}
std::vector<Shape> *intvec;

Когда я хочу вернуться к этому, как бы я это сделал? Как то так?

Shape s;
s.c=1;
s.d=1;
intvec->push_back(s);

Кроме того, я написал итератор для прохождения, однако он, похоже, не работает, поэтому я считаю, что приведенный выше код не работает. Наконец, моя последняя проблема: хотя приведенный выше код работает, он дает действительно странные значения для моего вывода. Большие числа длиной 7 цифр и определенно не те значения, которые я ввел для s.c и s.d

for(std::vector<Shape>::iterator it=Shapes->begin();it<Shapes->end();it++){
    Shape s = (*it);
    std::cout << s.c << s.d << std::endl;
}

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Использование вектора указателей на векторы не более эффективно, чем вектор векторов.Это менее эффективно, потому что вводит дополнительный уровень косвенности.Кроме того, не приводит к тому, что все элементы результирующего двумерного массива распределяются непрерывно.

Причина в том, что вектор практически является указателем на массив в том смысле, чтоvector<T> реализован примерно как

 template <typename T>
 class vector
 {
     T *p;  // pointer to array of elements
     size_t nelems, capacity;

   public:
     // interface
 };

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

[Примечание: я не могупроцитирую стандартную главу и стих C ++, но я почти уверен, что она ограничивает операции и сложность std::vector таким образом, что вышеприведенное является единственным практическим способом его реализации.]

0 голосов
/ 03 февраля 2012

Что касается вашего обновленного вопроса о том, является ли более эффективным использование указателя на вектор над самим вектором.В некоторых случаях более эффективно использовать указатель на вектор, а не на сам вектор.Конкретным примером будет использование вектора в качестве параметра для функции.

EX:

void somefunction(std::vector<int> hello)

В этом случае конструктор копирования для std :: vector вызывается каждый раз, когда вызывается эта функция (которая полностью копирует вектор, ВКЛЮЧАЯ элементы, содержащиеся в векторе).Передача по ссылке избавляет от этой дополнительной копии.

Что касается того, является ли сам push_back более эффективным при использовании указателя на вектор.Нет, не более эффективно использовать указатель (они должны быть примерно эквивалентны по времени).

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