Информировать 7 . Пример правильной программы:
Chomsky is a room. A thought is a kind of thing. Color is a kind of value. The colors are red, green and blue. A thought has a color. It is usually Green. A thought can be colorful or colorless. It is usually colorless. An idea is a thought in Chomsky with description "Colorless green ideas sleep furiously." A manner is a kind of thing. Furiously is a manner. Sleeping relates one thought to one manner. The verb to sleep (he sleeps, they sleep, he slept, it is slept, he is sleeping) implies the sleeping relation. Colorless green ideas sleep furiously.
Другие глупости, подобные этой Симулятор машины Тьюринга можно найти.
poly
значения будут скопированы в _poly
, но вы сделаете дополнительную копию в процессе. Лучший способ сделать это - передать по ссылке const:
void polynomial::Set(const vector<int>& poly) {
_poly = poly;
}
EDIT Я упоминал в комментариях о копировании и замене. Другой способ реализовать то, что вы хотите, -
void polynomial::Set(vector<int> poly) {
_poly.swap(poly);
}
. Это дает вам дополнительное преимущество, заключающееся в наличии строгой гарантии исключения вместо базовой гарантии. В некоторых случаях код тоже может быть быстрее, но я считаю это большим плюсом. Единственное, что этот код можно назвать «более трудным для чтения», поскольку нужно понимать, что существует неявная копия.
Это сделает мелкую копию вектора целых чисел. Обычно это работает так, как вы ожидаете (_poly в конечном итоге будет содержать те же значения, что и poly).
Вы бы увидели странное поведение, если бы у вас были указатели (поскольку они копировались бы по значению).
В общем, вы можете передать этот параметр по ссылке const:
void polynomial::Set( const vector<int>& poly )
В этом случае передача по ссылке const не повлияет на результат и будет более эффективной, поскольку удалит ненужную копию вектора, передаваемого в метод.
Это скопирует весь вектор. Присвоение по значению в C ++. Если вы назначаете указатель, присваивается значение указателя. Ссылки не могут быть переназначены для ссылки на другой объект после инициализации, поэтому их назначение изменяет объект ссылки.
Оператор копирования для векторов скопирует содержимое вектора.
Да, указанная вами линия копирует весь вектор. Кроме того, при вызове функции также будет копия, поскольку это не const.
Обычно, если вектор имеет какой-либо размер, это ОЧЕНЬ дорого.
Ваш вектор будет скопирован.
На самом деле происходит то, что оператор "=" вектора был перегружен для фактического копирования.
Есть три возможности:
void someFunction(SomeClass theObject);
void someFunction(SomeClass *theObject);
void someFunction(SomeClass &theObject);
Если вы не назначаете или не передаете параметр по ссылке (с использованием префикса &), вы передаете его по значению. Для классов это означает, что копия объекта создается с использованием либо предоставленного, либо неявно сгенерированного (неглубокого) конструктора копии для типа. Это может быть дорогостоящим и часто нежелательным.
В вашем примере вектор копируется дважды - один раз, когда он передается в качестве параметра методу Set (), и еще раз, когда он назначается члену _poly.
Вы можете избежать первой копии, передав вектор по ссылке:
void polynomial::Set(const vector<int>& poly) // passes the original parameter by reference
{
_poly = poly; // still makes a copy
}