2012-01-07 6 views
0

Я создал класс «Светлячок», похожее на это:Два вопроса о вектора использования

class firefly{ 

private: 

    float time_flash; 

public: 

firefly(int, int, float, float);//parametric constr. 
firefly(); 
firefly(const firefly& a);//copy constructor 

void receive_flash(std :: vector<firefly>&, float, float, int); 
friend bool operator <(const firefly&) const; 
}; 

Фокус на последних двух функций; У меня есть два вопроса. В основной программе я хотел инициализировать вектор светлячков следующим образом:

vector <firefly> fire_vec(10, firefly(5, 5,(float) 1., (float)1.)); 

с использованием параметрического конструктора. Я могу сделать это? Второй вопрос. Этот вектор должен быть заказан по алгоритму сортировки,

sort(fire_vec.begin(), fire_vec.end()); 

перегрузив оператора < следующим образом:

bool operator <(const firefly &rhs) const {return time_flash < rhs.time_flash;} 

Что плохого в этом? (я думаю, что что-то не так, потому что я не могу)

+3

«Могу ли я это сделать?» Попробуй. «Я не могу» Почему бы и нет? –

+1

И, пожалуйста, напишите один вопрос на вопрос. Вот почему они называются вопросами. –

ответ

0

Я не уверен, с чем вы столкнулись, но если бы вы попытались скомпилировать этот код, вы бы нашли, что

friend bool operator <(const firefly&) const; 

является незаконным: вы не можете использовать квалификатор const при автономной функции. Кроме того, operator< является двоичным оператором, поэтому он должен принимать два аргумента, оба типа const firefly &.

Вы также можете реализовать operator< в качестве функции-члена, как вы предлагаете, но затем опустите объявление friend.

Кроме того, в коде нет ничего плохого, за исключением того, что сортировка вектора полностью равных элементов - пустая трата времени.

+0

Теперь я пытался поставить определение перегруженного оператора <в глобальной области основного, такие как: BOOL оператора <(сопзЬ светлячка & RHS, Const светлячка & LHS) { флоат а, б; a = rhs.get_time(); b = lhs.get_time(); return a

+1

@MattF. Вы * должны сообщить нам ошибку компилятора.Вы сказали, что «он не может скомпилировать». Расскажите нам все, что сможете. Возможно, вам будет полезно скопировать код на http://ideone.com/ и попросить его скомпилировать его для нас - это позволит всем нам увидеть ошибки, и это позволит вам показать нам, что именно вы делает. –

+0

Этот идентификатор кода. Благодарю. http://ideone.com/NGfFG –

0

Извините, но почему вы выбираете вектор + настраиваемую сортировку, а не задаете/сопоставляете с помощью настроенного компаратора?

Обычно мы используем вектор в основном из-за требования к произвольному доступу его элементов через индекс. Если это не так, и особенно в вашем случае, вам нужен отсортированный вектор, я бы предложил набор/карту.

+0

На самом деле, «карта», основанная на 'std :: vector ', будет ** намного быстрее **, если вам нужны только поисковые запросы после ее установки. Даже если необходимо внести изменения, производительность сортированного 'std :: vector ' может превосходить производительность 'std :: map ', в зависимости от размера и количества изменений по сравнению с количеством взглядов -UPS. Правда, я не сравнивал, используя отсортированный 'std :: vector ' с 'std :: unordered_map '. –

-2

На второй вопрос, который вы должны будете пройти перегруженную функцию сортировки в качестве аргумента

сортировки (myvector.begin() + 4, myvector.end(), MYFUNCTION);

+1

Нет, если он предоставляет оператор <. – Anteru

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