Вектор задать – с примерами. Просто и понятно!

Содержание

Векторы и операции над векторами

Прежде чем Вы узнаете всё о векторах и операциях над ними, настройтесь на решение несложной задачи. Есть вектор Вашей предприимчивости и вектор Ваших инновационных способностей. Вектор предприимчивости ведёт Вас к Цели 1, а вектор инновационных способностей — к Цели 2. Правила игры таковы, что Вы не можете двигаться сразу по направлениям двух этих векторов и достигнуть сразу двух целей. Векторы взаимодействуют, или, если говорить математическим языком, над векторами производится некоторая операция. Результатом этой операции становится вектор «Результат», который приводит Вас к Цели 3.

А теперь скажите: результатом какой операции над векторами «Предприимчивость» и «Инновационные способности» является вектор «Результат»? Если не можете сказать сразу, не унывайте. По мере изучения этого урока Вы сможете ответить на этот вопрос.

Как мы уже увидели выше, вектор обязательно идёт от некоторой точки A по прямой к некоторой точке B. Следовательно, каждый вектор имеет не только числовое значение — длину, но также физическое и геометрическое — направленность. Из этого выводится первое, самое простое определение вектора. Итак, вектор — это направленный отрезок, идущий от точки A к точке B. Обозначается он так: .

А чтобы приступить к различным операциям с векторами, нам нужно познакомиться с ещё одним определением вектора.

Вектор — это вид представления точки, до которой требуется добраться из некоторой начальной точки. Например, трёхмерный вектор, как правило, записывается в виде (х, y, z). Говоря совсем просто, эти числа означают, как далеко требуется пройти в трёх различных направлениях, чтобы добраться до точки.

Пусть дан вектор. При этом x = 3 (правая рука указывает направо), y = 1 (левая рука указывает вперёд), z = 5 (под точкой стоит лестница, ведущая вверх). По этим данным вы найдёте точку, проходя 3 метра в направлении, указываемом правой рукой, затем 1 метр в направлении, указываемом левой рукой, а далее Вас ждёт лестница и, поднимаясь на 5 метров, Вы, наконец, окажетесь в конечной точке.

Все остальные термины — это уточнения представленного выше объяснения, необходимые для различных операций над векторами, то есть, решения практических задач. Пройдёмся по этим более строгим определениям, останавливаясь на типичных задачах на векторы.


Физическими примерами векторных величин могут служить смещение материальной точки, двигающейся в пространстве, скорость и ускорение этой точки, а также действующая на неё сила.


Геометрический вектор представлен в двумерном и трёхмерном пространстве в виде направленного отрезка. Это отрезок, у которого различают начало и конец.

Если A — начало вектора, а B — его конец, то вектор обозначается символом или одной строчной буквой . На рисунке конец вектора указывается стрелкой (рис. 1)


Длиной (или модулем) геометрического вектора называется длина порождающего его отрезка


Два вектора называются равными, если они могут быть совмещены (при совпадении направлений) путём параллельного переноса, т.е. если они параллельны, направлены в одну и ту же сторону и имеют равные длины.


В физике часто рассматриваются закреплённые векторы, заданные точкой приложения, длиной и направлением. Если точка приложения вектора не имеет значения, то его можно переносить, сохраняя длину и направление в любую точку пространства. В этом случае вектор называется свободным. Мы договоримся рассматривать только свободные векторы.

Умножение вектора на число


Сложение и вычитание векторов

Слагаемые

называются составляющими вектора , а сформулированное правило — правилом многоугольника. Этот многоугольник может и не быть плоским.

Пример 1. Упростить выражение:

.

Решение:

,

то есть, векторы можно складывать и умножать на числа так же, как и многочлены (в частности, также задачи на упрощение выражений). Обычно необходимость упрощать линейно подобные выражения с векторами возникает перед вычислением произведений векторов.

Пример 2. Векторы и служат диагоналями параллелограмма ABCD (рис. 4а). Выразить через

и векторы , , и , являющиеся сторонами этого параллелограмма.

Решение. Точка пересечения диагоналей параллелограмма делит каждую диагональ пополам. Длины требуемых в условии задачи векторов находим либо как половины сумм векторов, образующих с искомыми треугольник, либо как половины разностей (в зависимости от направления вектора, служащего диагональю), либо, как в последнем случае, половины суммы, взятой со знаком минус. Результат — требуемые в условии задачи векторы:

Есть все основания полагать, что теперь Вы правильно ответили на вопрос о векторах «Предприимчивость» и «Инновационные способности» в начале этого урока. Правильный ответ: над этими векторами производится операция сложения.

Решить задачи на векторы самостоятельно, а затем посмотреть решения

Как найти длину суммы векторов?

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

Даны длины векторов и длина суммы этих векторов . Найти длину разности этих векторов .

Решения этой и других подобных задач и объяснения, как их решать — в уроке «

Сложение векторов: длина суммы векторов и теорема косинусов«.

А проверить решение таких задач можно на Калькуляторе онлайн «Неизвестная сторона треугольника (сложение векторов и теорема косинусов)».

А где произведения векторов?

Произведения вектора на вектор не являются линейными операциями и рассматриваются отдельно. И у нас есть уроки «Скалярное произведение векторов» и «Векторное и смешанное произведения векторов».

Проекция вектора на ось равна произведению длины проектируемого вектора на косинус угла между вектором и осью:

Как известно, проекцией точки A на прямую (плоскость) служит основание

перпендикуляра , опущенного из этой точки на прямую (плоскость).

Пусть — произвольный вектор (Рис. 5), а и — проекции его начала (точки A) и конца (точки B) на ось l. (Для построения проекции точки A) на прямую проводим через точку A плоскость, перпендикулярную прямой. Пересечение прямой и плоскости определит требуемую проекцию.

Составляющей вектора на оси l называется такой вектор , лежащий на этой оси, начало которого совпадает с проекцией начала, а конец — с проекцией конца вектора

.

Проекцией вектора на ось l называется число

,

равное длине составляющего вектора на этой оси, взятое со знаком плюс, если направление составляюшей совпадает с направлением оси l, и со знаком минус, если эти направления противоположны.

Основные свойства проекций вектора на ось:

1. Проекции равных векторов на одну и ту же ось равны между собой.

2. При умножении вектора на число его проекция умножается на это же число.

3. Проекция суммы векторов на какую-либо ось равна сумме проекций на эту же ось слагаемых векторов.

4. Проекция вектора на ось равна произведению длины проектируемого вектора на косинус угла между вектором и осью:

Пример 5. Рассчитать проекцию суммы векторов на ось l, если , а углы —

.

Решение. Спроектируем векторы на ось l как определено в теоретической справке выше. Из рис.5а очевидно, что проекция суммы векторов равна сумме проекций векторов. Вычисляем эти проекции:

Находим окончательную проекцию суммы векторов:

.

Знакомство с прямоугольной декартовой системой координат в пространстве состоялось в соответствующем уроке, желательно открыть его в новом окне.

В упорядоченной системе координатных осей 0xyz ось Ox называется осью абсцисс, ось 0yосью ординат, и ось 0zосью аппликат.

С произвольной точкой М  пространства свяжем вектор

,

называемый радиус-вектором точки М и спроецируем его на каждую из координатных осей. Обозначим величины соответствующих проекций:

Числа x, y, z называются координатами точки М , соответственно абсциссой, ординатой и аппликатой, и записываются в виде упорядоченной точки чисел: M (x; y; z) (рис.6).

Вектор единичной длины, направление которого совпадает с направлением оси, называют единичным вектором(или ортом) оси. Обозначим через



Соответственно орты координатных осей Ox, Oy, Oz


Теорема. Всякий вектор может быть разложен по ортам координатных осей:

        (2)

Равенство (2) называется разложением вектора по координатным осям. Коэффициентами этого разложения являются проекции вектора на координатные оси. Таким образом, коэффициентами разложения (2) вектора по координатным осям являются координаты вектора.

После выбора в пространстве определённой системы координат вектор и тройка его координат однозначно определяют друг друга, поэтому вектор может быть записан в форме

              (3)

Представления вектора в виде (2) и (3) тождественны.

Как мы уже отмечали, векторы называются коллинеарными, если они связаны отношением

.

Пусть даны векторы . Эти векторы коллинеарны, если координаты векторов связаны отношением

,

то есть, координаты векторов пропорциональны.

Пример 6. Даны векторы . Коллинеарны ли эти векторы?

Решение. Выясним соотношение координат данных векторов:

.

Координаты векторов пропорциональны, следовательно, векторы коллинеарны, или, что то же самое, параллельны.

Вследствие взаимной перпендикулярности координатных осей длина вектора

равна длине диагонали прямоугольного параллелепипеда, построенного на векторах

и выражается равенством

                       (4)

Вектор полностью определяется заданием двух точек (начала и конца), поэтому координаты вектора можно выразить через координаты этих точек.

Пусть в заданной системе координат начало вектора находится в точке

а конец – в точке

(рис.8).

Тогда

Из равенства


следует, что

Отсюда

или в координатной форме

          (5)

Следовательно, координаты вектора равны разностям одноимённых координат конца и начала вектора. Формула (4) в этом случае примет вид

          (6)

Направление вектора определяют направляющие косинусы. Это косинусы углов, которые вектор образует с осями Ox, Oy и Oz. Обозначим эти углы соответственно α, β и γ. Тогда косинусы этих углов можно найти по формулам

,

,

.

Направляющие косинусы вектора являются также координатами орта этого вектора и, таким образом, орт вектора

или

.

Учитывая, что длина орта вектора равна одной единице, то есть

,

получаем следующее равенство для направляющих косинусов:

.

Пример 7. Найти длину вектора x = (3; 0; 4).

Решение. Длина вектора равна

Пример 8. Даны точки:

Выяснить, равнобедренный ли треугольник, построенный на этих точках.

Решение. По формуле длины вектора (6) найдём длины сторон и установим, есть ли среди них две равные:

Две равные стороны нашлись, следовательно необходимость искать длину третьей стороны отпадает, а заданный треугольник является равнобедренным.

Пример 9. Найти длину вектора и его направляющие косинусы, если .

Решение. Координаты вектора даны:

.

Длина вектора равна квадратному корню из суммы квадратов координат вектора:

.

Находим направляющие косинусы:

Решить задачу на векторы самостоятельно, а затем посмотреть решение

Пусть даны два вектора и , заданные своими проекциями:

или

или 

Укажем действия над этими векторами.

1.Сложение:

или, что то же

(при сложении двух векторов одноимённые координаты складываются).

2.Вычитание:

или, что то же

,

(при вычитании двух векторов одноимённые координаты вычитаются).

3.Умножение вектора на число:

или, что то же

,

(при умножении вектора на число все координаты умножаются на это число).

Пример 11. Даны два вектора, заданные координатами:

.

Найти заданный координатами вектор, являющийся суммой этих векторов: .

Решение:

.

Решить задачи на координаты векторов самостоятельно, а затем посмотреть решение

При изучении многих вопросов, в частности, экономических, оказалось удобным обобщить рассмотренные приёмы установления соответствия между числами и точками двумерного и трёхмерного пространства и рассматривать последовательности n действительных чисел как «точки» некоторого абстрактного «n-мерного пространства», а сами числа — как «координаты» этих точек. За составляющие n-мерного вектора можно принимать такие данные, как урожайность различных культур, объёмы продаж товаров, технические коэффициенты, номенклатура товаров на складах и т.д.

n-мерным вектором называется упорядоченный набор из n действительных чисел, записываемых в виде

,

где  - i – й элемент (или i – я координата) вектора x.

Возможна и другая запись вектора – в виде столбца координат:

Размерность вектора определяется числом его координат и является его отличительной характеристикой. Например, (2; 5) – двухмерный вектор, (2; -3; 0) – трёхмерный, (1; 3; -2; -4; 7) – пятимерный,

n – мерный вектор.

Нулевым вектором называется вектор, все координаты которого равны нулю:

0 = (0; 0; …; 0).

Введём операции над n-мерными векторами.

Произведением вектора


на действительное число  называется вектор

(при умножении вектора на число каждая его координата умножается на это число).

Зная вектор

можно получить противоположный вектор

Суммой векторов

и

называется вектор

,

(при сложении векторов одной и той же размерности их соответствующие координаты почленно складываются).

Если в плане продаж сети торговых предприятий продажи товаров определить как положительные уровни товаров, а затраты на продажи – как отрицательные, то получим вектор затрат-продаж

,

где

продажи (затраты) k – м предприятием товара i, а k = 1, 2, 3,…, m .

Суммарный вектор затрат-продаж y определяется суммированием векторов затрат-продаж всех m предприятий сети:

Сумма противоположных векторов даёт нулевой вектор:

При вычитании двух векторов одной и той же размерности их соответствующие координаты почленно вычитаются:

Операции над n-мерными векторами удовлетворяют следующим свойствам.

Свойство 1.


Свойство 2.

Свойство 3.

Свойство 4.

Свойство 5.

Свойство 6.

Поделиться с друзьями

Весь блок «Аналитическая геометрия»

  • Векторы
  • Плоскость
  • Прямая на плоскости

function-x.ru

Примеры решения задач с векторами

Примеры решения задач с векторами

Вектора применяются во многих науках, таких как: математика, физика, геометрия и многих других прикладных науках. На практике, они позволяют не делать лишних операций и сократить время выполнения задач. Поэтому, будущим специалистам очень важно понять теорию векторов и научиться решать задачи с ними.

Перед изучением примеров решения задач советуем изучить теоретический материал по векторам, прочитать все определения и свойства. Список тем находится в правом меню.

Координаты вектора

Теоретический материал по теме — координаты вектора.

Пример

Запись означает, что вектор имеет следующие координаты: абсцисса равна 5, ордината равна -2.

Пример

Задание. Заданы векторы и . Найти координаты вектора

Решение.

Пример

Задание. Вектор . Найти координаты вектора

Решение.

Пример

Задание. Найти координаты вектора , если

Решение.

Длина (модуль) вектора

Теоретический материал по теме — длина вектора.

Пример

Задание. Найти длину вектора

Решение. Используя формулу, получаем:

Пример

Задание. Найти длину вектора

Решение. Используя формулу, получаем:

Угол между векторами

Теоретический материал по теме — угол между векторами.

Пример

Задание. Известно, что скалярное произведение двух векторов , а их длины . Найти угол между векторами и .

Решение. Косинус искомого угла:

Пример

Задание. Найти угол между векторами и

Решение. Косинус искомого угла

Пример

Задание. Найти угол между векторами и

Решение. Косинус искомого угла:

Разложение вектора по ортам координатных осей

Теоретический материал по теме — разложение вектора по ортам.

Пример

Задание. Зная разложения вектора по базисной системе векторов: , записать координаты этого вектора в пространстве.

Решение. Коэффициенты при ортах и есть координатами вектора, поэтому из того, что , получаем, что

Пример

Задание. Вектор задан своими координатами: . Записать разложение данного вектора по ортам осей координат.

Решение. Координаты вектора — это коэффициенты при ортах координатных осей в разложении вектора по базисной системе векторов, поэтому искомое разложение:

Скалярное произведение векторов

Теоретический материал по теме — скалярное произведение векторов.

Пример

Задание. Вычислить скалярное произведение векторов и , если их длины соответственно равны 2 и 3, а угол между ними 60°.

Решение. Так как из условия , , а , то

Пример

Задание. Найти скалярное произведение векторов и

Решение. Скалярное произведение

Векторное произведение векторов

Теоретический материал по теме — векторное произведение векторов.

Пример

Задание. Найти векторное произведение векторов и

Решение. Составляем определитель и вычисляем его:

Смешанное произведение векторов

Теоретический материал по теме — смешанное произведение векторов.

Пример

Задание. Вычислить объем пирамиды, построенной на векторах , ,

Решение. Найдем смешанное произведение заданных векторов, для это составим определитель, по строкам которого запишем координаты векторов , и :

studfile.net

Тема II – векторная алгебра

И АНАЛИТИЧЕСКАЯ ГЕОМЕТРИЯ

§5. Векторы

5.1. Основные понятия

  • Рассмотрим направленный отрезок прямой на плоскости или в пространстве, пусть А – начальная точка этого отрезка, В – конечная точка.

Такой отрезок называется вектором и обозначается . Точки А и В называютсяначалом и концом вектора соответственно. Длина отрезка АВ называется длиной или модулем вектора: .

Для того, чтобы задать вектор, необходимо указать:

1) прямую, на которой лежит вектор или которой он параллелен;

2) направление (ориентацию) вектора на этой прямой;

3) длину вектора.

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

Заметим, что от любой точки пространства можно отложить вектор , равный данному, и при этом только один.

5.2. Операции над векторами

Из правила треугольника сложения векторов следует правило их вычитания: действительно, если , то.

Свойства:

1)

2)

3)

4)

5)

Теорема 5.1. Векторы коллинеарны тогда и только тогда, когда для некоторого.

Пример. В треугольнике АВС точки M, N, K – середины сторон АВ, АС, ВС соответственно. Найти векторы , если.

Решение: По условию, . Применяя правило вычитания, находим:

, .

Далее, AK — половина диагонали параллелограмма, сторонами которого являются отрезки АВ и АС (так как диагонали параллелограмма точкой пересечения делятся пополам). Следовательно, по правилу параллелограмма сложения векторов, имеем .

5.3. Координаты векторов

  • Ортонормированным репером в трехмерном пространстве называется совокупность начальной точки О и векторов , таких, что:

1)(единичные векторы),

2) (попарно перпендикулярные),

3) векторы образуют правую тройку векторов, то есть из конца вектораповорот от векторак векторувиден в положительном направлении – против часовой стрелки.

Втаком случае обычная декартова система координат соответствует заданному ортонормированному реперу, так что направления осейОх, Оу, Oz совпадают с направлениями базисных векторов .

Рассмотрим теперь произвольный вектор в трехмерном пространстве.

  • Координатами вектора называются его проекцииа1, а2, а3 на оси координат. Обозначают: .

Отметим, что если вектор отложен от начала координат, то его координаты совпадают с координатами конца этого вектора.

Применив дважды правило параллелограмма, замечаем, что

.

Свойства:

Пусть ,. Тогда

1)

2)

3)

4)

5) Орт вектора , где, , — углы между вектором и координатными осями. Координаты орта называютнаправляющими косинусами вектора .

Теорема 5.2. Пусть точка А имеет координаты

(xA, yA, zA), точка В(xВ, yВ, zВ).

Тогда .

Для доказательства достаточно заметить, что ,

причем .

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

Доказательство этого факта предоставим читателю.

Многие геометрические задачи на плоскости и в пространстве легко решаются с помощью векторов. При этом надо все условия задачи, сформулированные для точек и отрезков (а в дальнейшем – и углов) переформулировать для векторов, а затем перевести в координатную форму. Если рассматривается задача на плоскости, то и точки, и векторы имеют 2 координаты, и все сформулированные выше свойства имеют место для первых двух координат.

Пример 1: Точка М делит пополам отрезок АВ, где А(xA, yA, zA), В(xВ, yВ, zВ). Найти координаты точки М.

Решение: Для решения этой задачи используем векторы.

Точка М лежит на отрезке АВ , причем эти векторы сонаправлены.

Кроме того, по условию, .

Следовательно, .

Обозначим координаты точки М (xМ, yМ, zМ). Тогда ,.

Используя свойство 2) координат, имеем:

,

откуда выражаем

.

Пример 2. Даны точки: A(1; 0), B(4; 2), C(2; 5). Найти точку пересечения медиан треугольника АВС.

Решение: Как известно, все медианы треугольника пересекаются в одной точке. Обозначим эту искомую точку К(xK, yK) и рассмотрим две медианы: BN и CM.

Найдем сначала координаты точек N и M как середин сторон АВ и АС (см. Пример 1)

Точка М – середина отрезка АВ  .

Аналогично, . Следовательно, можем найти координаты векторов:

Точка КСМ  (свойство 4). Аналогично,

точка КBN  .

Мы получили два линейных уравнения с двумя неизвестными – координатами точки К. Решаем полученную систему:

.

Таким образом, искомая точка .

Замечание. При решении задачи использовался схематический рисунок. Однако часто при решении задачи на плоскости удобнее использовать чертеж в системе координат, отражающий истинное положение данных точек. Это позволяет, в частности, оценить правильность решения.

studfile.net

std::vector — cppreference.com

template<

    class T,
    class Allocator = std::allocator<T>

> class vector;
(1)
namespace pmr {

    template <class T>
    using vector = std::vector<T, std::polymorphic_allocator<T>>;

}
(2) (начиная с C++17)

1) std::vector — последовательный контейнер, инкапсулирующий массивы переменного размера.

Элементы хранятся непрерывно, а значит доступны не только через итераторы, но и через смещения, добавляемые к указателям на элементы (data() или же, для непустых массивов, — &vect[0]). Это означает, что указатель на элемент вектора может передаваться в любую функцию, ожидающую указатель на элемент массива.(начиная с C++03)

Хранилище вектора обрабатывается автоматически, расширяясь и сужаясь по мере необходимости. Векторы обычно занимают больше места, чем статические массивы, поскольку некоторое количество памяти выделяется про запас на обработку будущего роста. Таким образом, память для вектора требуется выделять не при каждой вставке элемента, а только после исчерпания резервов. Общий объём выделенной памяти можно получить с помощью функции capacity(). Резервная память может быть возвращена системе через вызов shrink_to_fit().

Перераспределения обычно являются дорогостоящими операциями в плане производительности. Функция reserve() может использоваться для предварительного выделения памяти и устранения перераспределений, если заранее известно количество элементов.

Сложность (эффективность) обычных операций над векторами следующая:

  • Произвольный доступ — постоянная O(1)
  • Вставка и удаление элементов в конце — амортизированная постоянная O(1)
  • Вставка и удаление элементов — линейная по расстоянию до конца вектора O(n)

std::vector соответствует требованиям Container, AllocatorAwareContainer, SequenceContainer, ContiguousContainer (для T отличных от bool) (начиная с C++17) и ReversibleContainer.

[править] Параметры шаблона

T Тип элементов.
Тип T должен соответствовать требованиям CopyAssignable и CopyConstructible.(до C++11)
Требования, налагаемые на элементы, зависят от конкретных операций, производимых с контейнером. Как правило, требуется, чтобы тип элементов соответствовал требованиям MoveConstructible и MoveAssignable, но многие функции-члены налагают более строгие требования.(начиная с C++11)

[править]

Allocator Аллокатор, используемый для выделения памяти под элементы. Тип должен соответствовать требованиям Allocator. [править]

[править] Специализации

Стандартная библиотека содержит специализацию std::vector для типа bool, эффективно использующую память.

[править] Типы-члены

[править] Функции-члены

Создаёт vector
(public функция-член) [править]
Уничтожает vector
(public функция-член) [править]
Задаёт значения в контейнере
(public функция-член) [править]
Задаёт значения в контейнере
(public функция-член) [править]
Возвращает связанный аллокатор
(public функция-член) [править]
Доступ к элементам
Предоставляет доступ к указанному элементу с проверкой индекса
(public функция-член) [править]
Предоставляет доступ к указанному элементу
(public функция-член) [править]
Предоставляет доступ к первому элементу
(public функция-член) [править]
предоставляет доступ к последнему элементу
(public функция-член) [править]
Предоставляет прямой доступ к внутреннему содержимому
(public функция-член) [править]
Итераторы
Возвращает итератор на первый элемент
(public функция-член) [править]
Возвращает итератор на элемент, следующий за последним
(public функция-член) [править]
Возвращает обратный итератор на первый элемент
(public функция-член) [править]
Возвращает обратный итератор на элемент, следующий за последним
(public функция-член) [править]
Вместимость
Проверяет отсутствие элементов в контейнере
(public функция-член) [править]
Возвращает количество элементов в контейнере
(public функция-член) [править]
Возвращает максимально допустимое количество элементов в контейнере
(public функция-член) [править]
Зарезервировать память.
(public функция-член) [править]
Возвращает количество элементов, которые могут одновременно храниться в выделенной области памяти
(public функция-член) [править]
Уменьшает использование памяти, высвобождая неиспользуемую
(public функция-член) [править]
Модификаторы
Очищает контейнер
(public функция-член) [править]
Вставляет элементы

Оригинал:

inserts elements

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
(public функция-член) [править]
Конструирует элементы «на месте» и вставляет их начиная с заданной позиции pos
(public функция-член) [править]
Удаляет элементы
(public функция-член) [править]
добавляет элемент в конец
(public функция-член) [править]
Конструирует элементы «на месте» в конце контейнера
(public функция-член) [править]
Удаляет последний элемент
(public функция-член) [править]
Изменяет количество хранимых элементов
(public функция-член) [править]
Обменивает содержимое
(public функция-член) [править]

[править] Функции-не члены

[править] Пример

Запустить этот код

#include <iostream>
#include <vector>
 
int main ( ) {
    // Создание вектора, содержащего целые числа
    std::vector<int> v = {7, 5, 16, 8};
 
    // Добавление ещё двух целых чисел в вектор
    v.push_back(25);
    v.push_back(13);
 
    // Проход по вектору с выводом значений
    for ( int n : v ) {
        std::cout << n << '\n';
    }
}

Вывод:

ru.cppreference.com

Аналог std::vector из C++11 на чистом C89 и как я его писал / Habr


Жилой массив людей. Нет, серьёзно.

Холивары между ценителями Си и приверженцами его ублюдка сына в лице C++ начались ещё до моего рождения и прекратятся разве что после смерти обоих этих языков и меня заодно.

Адепты великого творения Кернигана-Ритчи до последней секунды рабочего дня готовы доказывать приспешникам Страуструпа аксиомы про вечность Си и его невероятную гибкость.
Те в ответ по-свойски советуют им лучше порадоваться рабочему дню, ведь он вот-вот окажется последним – двадцать первому веку кроссплатформенный ассемблер не нужен.
Распаляясь, сторонники Си приводят миллионы давно прошедших через голову навылет тезисов «почему Си лучше C++», при этом каждый раз подчёркивая, что второй все достоинства первого растерял ещё будучи в отцовской утробе, попутно утратив лик человеческий.
Обвиняемая сторона в обиде не остаётся и…

а хотя постойте, о чём это я.

Я люблю Си, уважаю C++ и не переношу холивары (честно). При этом я осознаю, что в Си действительно не хватает многого, и яркий тому пример – отсутствие удобной работы с данными. В C++ эту проблему во многом решает STL и свойства самого языка. На мой студенческий взгляд, здесь особо отличается всем знакомый std::vector. Если стало интересно, как я реализовал его аналог средствами C89 – прошу под кат.


Вообще, с вышеописанной проблемой наверняка сталкивается каждый, кто переходит на Си с языка чуть более высокого уровня (в моём случае это были FreeBASIC и Free Pascal). Проблема отсутствия давно полюбившихся Redim и SetLength() вначале решается «в лоб кувалдой» при помощи realloc(). Потом приходят знания в обнимку с опытом, и вместо этого уже используется простенький самописный динамический массив.

Однако необходимость дублировать его код для каждого отдельно взятого типа данных с каждым разом всё сильнее вызывает раздражение. Туда же альтернативный вариант – использование указателей, требующее разыменований и приведений типов. А затем человеку попадает в руки C++ (или его аналог) и человек видит STL (или его аналог). Дальше можно прочитать в любом бульварном романе.

Тем не менее, влюбляются в тело, но любят душу. Если человек долгое время был в счастливых отношениях с Си, если в них уже появились проекты, то человеку вполне естественно хотеть сделать объект своей любви лучше – к обоюдной пользе. А человек в совершенствовании всегда на что-то ориентируется.

Короче говоря, это история о том, как любовь к Си заставила меня привнести в неё (него?) пресловутый std::vector – то, что мне нравилось в C++, которым (которой?) я в одно время увлёкся.


Уже было отмечено, что проблема отсутствия в Си встроенного динамического массива для произвольных типов не нова и по-разному решалась немало раз.
Вот те варианты реализации вектора, которые я нашёл буквально за пять минут в Google:

https://github.com/rxi/vec
https://github.com/eteran/c-vector
https://github.com/jibsen/scv
https://github.com/graphitemaster/cvec
https://github.com/robertkety/dataStructures (Ctrl+F «dynamicArray»)
http://troydhanson.github.io/uthash/utarray.html
https://github.com/dude719/Dynamic-Array-Kernel
https://developer.gnome.org/glib/stable/glib-Arrays.html
https://www.happybearsoftware.com/implementing-a-dynamic-array
https://github.com/nothings/stb/blob/master/stretchy_buffer.h (добавлено по наводке Xop)

Все эти решения имеют как минимум один из следующих фатальных недостатков:


  1. Реализация макросами конкретных функций управления.
    Использовать макросы в качестве inline-функций – затея плохая. Об этом говорилось много раз, но разве мы устанем повторять?
    Во-первых, при использовании макросов-функций тяжелее отслеживать и отлаживать ошибки, возникающие из-за неправильных типов аргументов.
    Во-вторых, макросы-функции не умеют ничего возвращать, если не брать во внимание извращения с comma-оператором или отдельным аргументом под имя переменной для хранения результата.
    В-третьих, из-за постоянных подстановок кода из макросов-функций, которые и на inline-то мало похожи, разбухает размер единицы трансляции. Отсюда следует увеличение размера выходного исполняемого файла и прочие радости жизни.
    В-четвёртых, на макрос-функцию нельзя взять указатель.


  2. Дублирование общих для любых векторов функций.
    Например, разные функции освобождения для вектора int‘ов и вектора char‘ов. Под капотом они будут представлять собой всего-навсего вызов функции free(), глубоко безразличной к тому, что хранится в уничтожаемом буфере, равно как и к типу указателя на него.
    Это опять же провоцирует увеличение объёма единиц трансляции, дублирование кода, а заодно и замусоривание пространства имён.


  3. Работа со значениями через нетипизированные указатели.
    Это обязывает всегда брать указатель на значение для добавления его даже в простой вектор примитивных типов (например int‘ов). А также не забываем о приведении типов и разыменованиях. Ну и о том, что в такой вектор можно потенциально засунуть значения разных типов, и никто нас об этом не предупредит.


  4. Обозначение типа вектора как структуры.
    Самый большой недостаток, при наличии одного которого даже полное отсутствие других уже не играет роли.
    Во-первых, обращение к элементам вектора происходит через поле структуры. Для одномерного вектора это уже неудобно – стоит ли говорить о многомерных.
    Во-вторых, все поля структуры, даже технические, свободно доступны пользователю.
    Во-третьих, практически полная несовместимость между векторами разных типов.
    В-четвёртых, для создания и удаления вектора требуется 2 вызова malloc() / free() соответственно – один на структуру и один на сам буфер вектора. Как нетрудно догадаться, для вектора размерности вызовов будет уже .
    В-пятых, передать такой вектор в свою функцию можно только по указателю на структуру, поэтому синтаксис обращения к нему в функции будет слегка другим (-> вместо . и всё такое прочее).


Таким образом, вырисовывается задача создания вектора, специализируемого для любых типов данных Си и обладающего следующими возможностями:


  1. Доступ к элементам вектора как к элементам обычного массива, вне зависимости от его размерности: vec[k], vec[i][j] и т.д.
  2. Управление вектором с помощью обычных функций, обладающих типизированными аргументами и возвращаемым значением, в отличие от макросов.
  3. Отсутствие дублирующегося кода благодаря специализации только тех функций, которые принимают и/или возвращают значения пользовательского типа.
  4. Отсутствие у пользователя прямого доступа к технической информации вектора.
  5. Совместимость между векторами разных типов на уровне присваивания одного другому.
  6. Возможность пользователю при специализации вектора указать способ передачи и возврата значений: по значению или по ссылке (через указатель).
  7. Максимальная схожесть интерфейса вектора с таковым у std::vector из C++11.

Заранее отвечу на вопрос, почему C89, а не хотя бы C99. Во-первых, это даёт поддержку компилятора из Visual Studio (хоть он мне и не нравится). Во-вторых, я сам очень люблю C99, но в данном случае почувствовал, что поставленную задачу можно решить и в более жёстких условиях. Как-никак, публикацию в «ненормальном программировании» надо оправдывать.

Когда я только начинал изучать Си, написание удобного вектора казалось мне сугубо невозможным – оператор индексации в голове ассоциировался строго с массивом, массив ассоциировался строго с типизированным указателем, а вектор при этом ассоциировался с необходимостью хранить техническую информацию в структуре. Я никак не мог уйти от мысли, что доступ к элементам вектора возможно реализовать только через поле этой самой структуры, а использование этого подхода подавляющим большинством реализаций вектора только укрепляло уверенность в этом.

Однако потом мне на глаза попалась библиотека динамических строк для Си под названием Simple Dynamic Strings, написанная в своё время для Redis. Она использует другой подход: техническая информация о векторе хранится не в структуре вместе с указателем на него, а в виде заголовка прямо перед самим буфером вектора в памяти. Это позволяет оперировать вектором напрямую через типизированный указатель, при этом размещение технической информации всегда достоверно известно.

Напомню, что типизированный указатель даёт возможность обращаться к элементам вектора через оператор индексации, как в обычном массиве. А расположение технической информации прямо перед самим вектором лишает пользователя прямого доступа к ней – для этого ему придётся манипулировать указателями. В случае же структуры как указатель на вектор, так и техническая информация являются её полями, доступ к которым одинаков.

Таким образом мы реализовали возможности (1) и (4). Идём дальше.

Так как теперь вектор – это просто типизированный указатель, то мы, казалось бы, уже можем обобщить для разных типов векторов такие функции как, например, функцию освобождения, просто обозначив аргумент «указатель на освобождаемый вектор» как void*. Общеизвестно, что в void* можно неявно преобразовать любой другой указатель, равно как и наоборот.

Однако можем ли мы это проделать для других функций? Как ни странно, но да. У нас нет функций, оперирующих непосредственно с самими хранимыми значениями – их изначально предполагалось специализировать отдельно для каждого типа вектора. По сути мы оперируем лишь местами хранения значений, но не самими значениями. Следовательно, нам достаточно знать только размер одного элемента, который можно хранить в технической информации вектора и заполнять в функции его создания путём передачи соответствующего аргумента. Такой трюк позволяет нам обобщить для разных типов векторов вообще все функции, а специализировать на их основе только те, которые принимают и/или возвращают значения пользовательского типа.

Пункты (2) и (3) реализованы. А так как в Си нет объектов и любое значение может быть переприсвоено другой переменной буквально копированием памяти, то реализован и пункт (5). Продолжаем в том же духе.

По сути, все специализируемые функции оперируют со значениями пользовательского типа одним из двух способов:


  • присвоение указанным элементам вектора переданного значения;
  • возврат значения указанного элемента.

Известно, что значение может передаваться в функцию или возвращаться из неё либо по значению (пардон за каламбур), либо по ссылке. Для примитивных типов предпочтительнее первый вариант, тогда как для сложных структур – второй.
Ссылок а-ля C++ в Си конечно же нет, но их заменят нам указатели.

Устали от текста? вопрос риторический.
Тогда приведу для наглядности определения вариантов одних и тех же функций, принимающих/возвращающих переменные по значению и по ссылке соответственно.

gvec_error_e gvec_NAME_push( gvec_NAME_t* phandle, const TYPE value )
gvec_error_e gvec_NAME_push( gvec_NAME_t* phandle, const TYPE* value )
TYPE gvec_NAME_front( gvec_NAME_t handle )
TYPE* gvec_NAME_front( gvec_NAME_t handle )

Видно, что в обоих случаях отличие лишь в одном символе.

Уже в C89 оператор присваивания доступен для всех типов, а не только для примитивных. Это позволяет передачу и возврат по ссылке или по значению в специализируемых функциях указывать аргументами макроса-специализатора. Правда возникает резонный вопрос: а почему не указывать это одним аргументом сразу для передачи и возврата одновременно? А очень просто: возврат по значению удобнее и быстрее в случае примитивных типов, но значение может быть не определено в случае отсутствия в векторе запрошенного элемента. При возврате по ссылке в таком случае мы можем просто вернуть NULL. Короче говоря, это оставлено на усмотрение самого программиста.

В итоге реализован пункт (6). Пункт (7) можно также считать реализованным по совокупности всех предыдущих.


Итоговая реализация библиотеки вектора на C89, готовая к практическому применению, находится здесь:

https://github.com/cher-nov/genvector (MIT License теперь WTFPL)

Простейший пример использования приведён в ReadMe.

Конечно, статья не освещает некоторые другие, менее сложные но не менее интересные аспекты реализации, на описание которых у меня не хватило лаконичности и красноречия. Также опущены разглагольствования по поводу решений, оказавшихся в итоге неудачными, и их переосмысления. Но я уверен, что ответы по первому можно получить из кода и ReadMe в репозитории, а по второму – из истории коммитов.

Это первая моя статья на Хабре, поэтому прошу судить как можно строже. За косноязычие – особенно.

Надеюсь, это всё окажется кому-то да полезным.

habr.com

Формулы векторов

1. Координаты вектора

Если вектор задан координатами своих начала и конца: , то его координаты равны разности соответствующих координат конца и начала:

   

2. Длина или модуль вектора

Если вектор , то его длина равна корню квадратному из суммы квадратов координат:

   

3. Сумма векторов

Если векторы и заданы своими координатами, то суммой этих векторов есть вектор, координаты которого равны сумме соответствующих координат векторов-слагаемых:

   

4. Умножение вектора на число

Чтобы найти произведение вектора на некоторое число , нужно каждую координату заданного вектора умножить на это число:

   

5. Скалярное произведение векторов

Если векторы и заданы своими координатами, то их скалярное произведение равно сумме произведений соответствующих координат:

   

6. Векторное произведение векторов

Если векторы и заданы своими координатами в некотором ортонормированном базисе , то их векторное произведение находится по формуле:

   

7. Смешанное произведение векторов

Если заданы три вектора и , то их смешанное произведение равно определителю, по строкам которого записаны координаты этих векторов:

   

Замечание. Обычно такой определитель вычисляется методом треугольников.

8. Угол между векторами

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

   

9. Проекция вектора на вектор

Проекция вектора на направление вектора равна отношение скалярного произведения этих векторов к модулю вектора :

   

Понравился сайт? Расскажи друзьям!

ru.solverbook.com

Вектор: определение и основные понятия

Определение вектора

Определение. Вектор — это направленный отрезок, то есть отрезок, имеющий длину и определенное направление. Графически вектора изображаются в виде направленных отрезков прямой определенной длины. (рис.1)

Вектор по двум точкам
рис. 1

Обозначение вектора

Вектор началом которого есть точка А, а концом — точка В, обозначается AB (рис.1). Также вектора обозначают одной маленькой буквой, например a.

Длина вектора

Для обозначения длины вектора используются две вертикальные линии слева и справа |AB|.

Нулевой вектор

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

Нулевой вектор обычно обозначается как 0.

Длина нулевого вектора равна нулю.

Сонаправленные вектора

Определение. Два коллинеарных вектора a и b называются сонаправленными векторами, если их направления совпадают: a↑↑b (рис. 3).

Сонаправленные вектора
рис. 3

Противоположно направленные вектора

Определение. Два коллинеарных вектора a и b называются противоположно направленными векторами, если их направления противоположны: a↑↓b (рис. 4).

Противоположно направленные вектора
рис. 4

Компланарные вектора

Определение. Вектора, параллельные одной плоскости или лежащие на одной плоскости называют компланарными векторами. (рис. 5).
Компланарные вектора
рис. 5

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

Равные вектора

Определение. Вектора a и b называются равными, если они лежат на одной или параллельных прямых, их направления совпадают, а длины равны (рис. 6).

Равные вектора
рис. 6

То есть, два вектора равны, если они коллинеарные, сонаправленые и имеют равные длины:

a = b, если a↑↑b и |a| = |b|.

ru.onlinemschool.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *