2015-03-30 6 views
2

Мне нужно инициализировать мой вектор с классом, который я создал, удерживая x, y двойные значения. есть ли лучший способ инициализировать его?инициализация вектора C++ со значениями

std::vector<CentroidXY> centroids; 
CentroidXY temp = CentroidXY(1504.907526094 , 1345.27375938); 
centroids.push_back(temp); 
temp = CentroidXY(1843.890860395045,1694.073652494); 
centroids.push_back(temp); 
temp = CentroidXY(1852.11101474414,1354.88360797918); 
centroids.push_back(temp); 

здесь CentroidXY.cpp

#include "CentroidXY.h" 

CentroidXY::CentroidXY(double X, double Y) 
{ 
    m_X = X; 
    m_Y = Y; 
} 
CentroidXY::CentroidXY(void) 
{ 
} 

CentroidXY::~CentroidXY(void) 
{ 
} 

здесь CentroidXY.h

#pragma once 
class CentroidXY 
{ 
public: 
    CentroidXY(double X, double Y); 
    CentroidXY(void); 
    ~CentroidXY(void); 

    double m_X; 
    double m_Y; 
}; 
+2

Вы действительно не знаете ed 'temp'. – juanchopanza

+0

Спасибо, что принял мой ответ. Однако у меня есть -1, поэтому, если вы обнаружите ошибку (если по этой причине -1), пожалуйста, дайте мне знать, чтобы будущие читатели не столкнулись с этим! – gsamaras

+1

@ G.Samaras ваш код работает для меня – Gilad

ответ

3

Я хотел бы использовать список инициализации, поэтому изменить:

CentroidXY::CentroidXY(double X, double Y) 
{ 
    m_X = X; 
    m_Y = Y; 
} 

к это:

CentroidXY::CentroidXY(double X, double Y) : m_X(X), m_Y(Y) 
{ } 

Source

Кроме того, вы можете изменить это (так как вам не нужно temp):

CentroidXY temp = CentroidXY(1504.907526094 , 1345.27375938); 
centroids.push_back(temp); 

к этому:

centroids.push_back(CentroidXY(1504.907526094 , 1345.27375938)); 

или (что эквивалентно вызов push_back):

centroids.emplace_back(CentroidXY(1504.907526094 , 1345.27375938)); 

или даже лучше:

centroids.emplace_back(1504.907526094 , 1345.27375938); 

Таким образом, код чище.

Интересная ссылка: push_back vs emplace_back

+2

Также можно использовать 'emplace_back'. – juanchopanza

+1

@juanchopanza это был мой следующий шаг при редактировании. – gsamaras

+2

Я думаю, вы должны использовать 'centroids.emplace_back (1504.907526094, 1345.27375938);' –

1

Как об этом:

std::vector<CentroidXY> centroids; 
centroids.push_back(CentroidXY(1504.907526094 , 1345.27375938)); 
centroids.push_back(CentroidXY(1843.890860395045, 1694.073652494)); 
centroids.push_back(CentroidXY(1852.11101474414, 1354.88360797918)); 
+0

Я предлагаю что-то не так? – CinCout

+0

Я не тот парень, который дал вам -1, но, вероятно, должна быть причина «новой». Смотрите мой ответ Гарг, вы были рядом. :) – gsamaras

+0

Кто заботится о нисходящем! Можете ли вы еще рассказать о том, почему «новый» здесь неверен? – CinCout

3

могли бы использовать:

auto centroids = std::vector<CentroidXY>() = { 
    { 1504.907526094, 1345.27375938 }, 
    { 1852.11101474414, 1354.88360797918 } 
}; 

или если вы не можете стоять почти всегда Auto (AAA), использование:

std::vector<CentroidXY> centroids = { 
    { 1504.907526094, 1345.27375938 }, 
    { 1852.11101474414, 1354.88360797918 } 
}; 
+0

Очень хороший ответ, +1! :) Жаль, что я не включил его в свой ответ! – gsamaras

+2

Не будет ли это работать только для C++ 11 и выше? – CinCout

+0

Да. Стандарт - это стандарт, я думаю. – Robinson

Смежные вопросы