Я получаю ошибку сегментации при вставке данных внутри вектора. Думаю вектор не выделен.
Я не хочу reserve размер. Как это сделать?
class A
{
private:
struct data
{
int x;
int y;
};
std::vector<data>Set;
public:
void insert()
{
Set[0].x = 5; Set[0].y = 6;
}
};
A a;
a.insert(); // Segmentation Fault
Что касается «Я не хочу резервировать размер» - обратите внимание, что это все равно будет неправильно, поскольку reserve выделяет некоторую память, но нет создает в ней какие-либо объекты.





Использовать
std::vector::push_back().
Доступ к первому элементу ( Set[0] ) является неопределенным поведением.
Построенный по умолчанию вектор пуст.
Совершенно правильный ответ, но могу ли я предложить пару правок? Вы можете сделать push_back ссылку на en.cppreference.com/w/cpp/container/vector/push_back и отформатировать фрагменты кода, окружив их обратными кавычками.
@BoBTFish Я думаю, что это принято делать, даже не спрашивая :)
Извиняюсь. Больше всего, что я сделал, было сахаром для глаз, но ссылка на де.cppreference — не очень хорошая идея. (Это может стать предметом перевода на немецкий язык.) Я провел голосование, чтобы компенсировать... ;-)
I think the vector is not allocated.
да, вы на правильном пути. У вас неопределенное поведение из-за вектора доступ к нераспределенным вдоль линий.
Set[0].x = 5; Set[0].y = 6;
Вы можете просто std::vector::push_back или std::vector::emplace_back сконструировать data следующим образом, что не требует доступа к вектор с помощью оператора индекса:
void insert()
{
Set.push_back(data{ 5, 6 });
// or
// Set.emplace_back(data{ 5, 6 });
}
Примечание: если data содержит непримитивные типы, рассмотрите возможность использования std::vector::emplace_back для создания dataна месте, а не создания по умолчанию и назначения членов, как в данном коде. Там вам также необходимо предоставить подходящий конструктор для data.
Да, у меня в основном не примитивные типы внутри данных структуры. Можете ли вы показать мне пример, как это сделать? Например, если я напишу Set.push_back(Data(5,6)) и предоставлю конструктор внутри Data . Как это будет работать? Он создаст временный объект данных и поместит этот временный объект в вектор. Итак, смогу ли я восстановить этот объект позже, потому что временный объект может быть удален?
@AnirbanSaha Мой первое редактирование был об этом. Как я упоминал в Примечание, вам нужно использовать emplace_back вместо push_back, который напрямую пересылает аргументы (параметры конструкторов) и создает объект data на месте. См. пример кода, приведенный на сайте cppreference.com: en.cppreference.com/w/cpp/container/vector/emplace_back#Example.
По умолчанию созданный вектор имеет размер 0, поэтому попытка доступа к элементу Set[0] неверна и приведет к ошибке сегментации (что здесь означает доступ к чему-то, чего нет).
Используйте std::vector::push_back, чтобы избежать ошибки сегментации
Вы можете переписать функцию следующим образом:
void insert()
{
data newItem;
newItem.x = 5; newItem.y = 6
Set.push_back(newItem)
}
Ты не имеешь в виду Set.push_back? Также не гарантируется, что SEG FAULT произойдет.
Да, я имел в виду это. Спасибо, что указали на это. Сделал правку.
используйте std::vector::push_back. доступ к [0] является проблемой