Are Riff Ответов: 2

Чем отличаются эти два вектора? (интеллектуальный указатель)


Я изучаю умные указатели.
class Elf {
private:
    int _health = 0;
public:
    Elf(const int &health){_health = health;}
    int getHealth(){return _health}
};


В чем разница между этими двумя?
Первый случай:
vector<unique_ptr<Elf>> elves;
for (auto i = 0; i < 10000; ++i) {
    elves.push_back(unique_ptr<Elf>(new Elf(90)));
}

Второй случай:
auto elves = make_unique<vector<Elf>>(10000, Elf(90));

=========
Второй вопрос.
В первом случае я могу получить доступ к частному члену _health с помощью этого:
for(auto i = 0; i < 10000; ++i){
    cout << elves[i]->getHealth() << " ";
}

Как получить доступ к _health во втором случае?

2 Ответов

Рейтинг:
2

Theo Buys

#include <memory>
#include <vector>


class Elf {
private:
	int _health = 0;
public:
	Elf(const int &health){ _health = health; }
	int getHealth(){ return _health; }
};


void Test()
{
	using namespace std;
	auto elves = make_unique<vector<Elf>>(10000, Elf(90));

	int out;
	for (auto i = 0; i < 10000; i++)
	{
		out = elves->at(i).getHealth(); /* out = 90 */
	}	

}


Dave Kreskowiak

Следите за датами на постах. Этому уже полтора года.

Theo Buys

Время на моей стороне. Почему никто не задал этот приятный вопрос?

Рейтинг:
0

Stefan_Lang

Цитата:
В чем разница между этими двумя?

Первый-это вектор (умных) указателей на эльфов, а второй-это (умный) указатель на вектор реальных эльфов.

Вы можете сравнить первый со знаком, указывающим на комод с эльфом, сидящим в каждом ящике (в основном большой дом), тогда как второй-это комод, где каждый ящик содержит домашний адрес эльфа (в основном адресная книга).

Цитата:
Как получить доступ к _health во втором случае?

Решение 1 должно работать, но если вы предпочитаете код, который использует оператор индекса (и, следовательно, ближе к первой версии), попробуйте это:
cout << (*elves)[i].getHealth();



С. П.:
Ой, только что заметил дату. Я предположил, что это был новый запрос, основанный на его перечислении на первой странице...