Нет, для вставки в myset здесь нет причин вызывать сбой.Проблема должна лежать в другом месте.Возможно, в ctor копии А, если вы не используете файл по умолчанию.
Однако ваш код пропускает память.При вставке в набор *tempElement
копируется в набор, а затем оригинал, выделенный с помощью new
, больше не используется, но никогда не удаляется.Вместо этого вы можете просто сделать A tempElement(i+1,tempVector);
, чтобы после копирования объекта в набор он был должным образом уничтожен.Или, может быть, лучше в этом случае вы могли бы просто создать его как временный элемент, передаваемый непосредственно для вставки: myset.insert(A(i+1,tempVector))
, в этом случае объект будет перемещен вместо копирования, что уменьшит накладные расходы.Или вы можете просто построить объект на месте, чтобы избежать даже перемещения: myset.emplace(i+1,tempVector);
Также я предполагаю, что под tempComponents[j] = j;
вы имели в виду tempVector[j] = j
.Вы можете заменить этот цикл на std::iota(begin(tempVector),end(tempVector),0)
. edit: или вы можете использовать новый синтаксис инициализатора Кроме того, поскольку вектор всегда один и тот же, вы можете использовать только один вне цикла:
vector<double> tempVector(3) = {0.0,1.0,2.0}
std::set<A> mySet;
for (uint i = 0; i < (uint) 10; i++)
{
myset.emplace(i+1,tempVector);
}
C ++ 03 компиляторы победили '• поддерживает emplace
или новый синтаксис инициализатора, и iota
будет для них расширением компилятора (это из исходного SGI STL, так что некоторые могут его иметь).Для тех, кто по-прежнему будет использовать вставку и использовать цикл for для инициализации tempVector или использовать массив:
double tempVector_init[] = {0.0,1.0,2.0};
vector<double> tempVector(tempVector_init,tempVector_init+3);
std::set<A> mySet;
for (uint i = 0; i < (uint) 10; i++)
{
myset.insert(A(i+1,tempVector));
}