Разное

If kjys c: Шаблоны на C. Да! На чистом С. Не С++ / Хабр

21.07.2023

Шаблоны и шаблонные функции в C++. Введение

Шаблонные функции

Давайте рассмотрим простой пример. Допустим, у нас есть функция, которая меняет местами значения двух переменных типа int:

#include <iostream>
void my_swap ( int & first , int & second )
{
    int temp ( first ) ;
    first = second ;
    second = temp ;
}
int main ()
{
    int a = 5 ; 
    int b = 10 ;
    std::cout << a << " " << b << std::endl ;
    my_swap ( a , b ) ;
    std::cout << a << " " << b << std::endl ;
}

Теперь, допустим, у нас в функции main так же есть две переменные типа double, значения которых тоже нужно обменять. Функция для обмена значений двух переменных типа int нам не подойдет. Напишем функцию для double:

void my_swap ( double & first , double & second )
{
    double temp ( first ) ;
    first = second ;
    second = temp ;
}

И теперь перепишем main:

int main ()
{
    int a = 5 ; 
    int b = 10 ;
    std::cout << a << " " << b << std::endl ;
    my_swap ( a , b ) ;
    std::cout << a << " " << b << std::endl ;
    double c = 77.
89 ; double d = 54.22 ; std::cout << c << " " << d << std::endl ; my_swap ( c , d ) ; std::cout << c << " " << d << std::endl ; }

Как видите, у нас алгоритм абсолютно одинаковый, отличаются лишь типы параметров и тип переменной temp. А теперь представьте, что нам еще нужны функции для short, long double, char, string и еще множества других типов. Конечно, можно просто скопировать первую функцию, и исправить типы на нужные, тогда получим новую функцию с необходимыми типами. А если функция будет не такая простая? А вдруг потом еще обнаружится, что в первой функции была ошибка? Избежать всего этого можно, например, «шаманством» с препроцессором, но это нам ни к чему, нам помогут шаблоны.

Для начала, заглянем в википедию и посмотрим, что же такое шаблоны:

Шабло́ны (англ. template) — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).
https://ru.wikipedia.org/wiki/Шаблоны_C++

Итак, описание шаблона начинается с ключевого слова template за которым в угловых скобках («<» и «>») следует список параметров шаблона. Далее, собственно идет объявление шаблонной сущности (например функция или класс), т. е. имеет вид:

template < template-parameter-list > declaration.

Теперь давайте напишем шаблонную функцию my_swap. Исходя из упомянутой выше структуры объявления шаблона следует, что наша функция будет выглядеть так: template < параметры_шаблона > описание_функции.

Напишем функцию:

template < typename T >
void my_swap ( T & first , T & second )
{
    T temp(first) ;
    first = second ;
    second = temp ;
}

typename в угловых скобках означает, что параметром шаблона будет тип данных. T — имя параметра шаблона. Вместо typename здесь можно использовать слово class: template < class T > В данном контексте ключевые слова typename и class эквивалентны (лично мне больше нравится typename, а кому-то class). Далее, в тексте шаблона везде, где мы используем тип T, вместо T будет проставляться необходимый нам тип.

void my_swap ( T & first , T & second ) //T - тип, указанный в параметре шаблона
{
    T temp(first) ; //временная переменная должна быть того же типа, что и параметры
    first = second ;
    second = temp ;
}

теперь давайте напишем функцию main:

int main ()
{
    int a = 5 ; 
    int b = 10 ;
    std::cout << a << " " << b << std::endl ;
    my_swap<int> ( a , b ) ;
    std::cout << a << " " << b << std::endl ;
    double c = 77.89 ;
    double d = 54.22 ;
    std::cout << c << " " << d << std::endl ;
    my_swap<double> ( c , d ) ;
    std::cout << c << " " << d << std::endl ;
}

Как видите, после имени функции в угловых скобках мы указываем тип, который нам необходим, он то и будет типом T. Шаблон — это лишь макет, по которому компилятор самостоятельно будет генерировать код.

При виде такой конструкции: my_swap<тип> компилятор сам создаст функцию my_swap с необходимым типом. Это называется инстанцирование шаблона. То есть при виде my_swap<int> компилятор создаст функцию my_swap в которой T поменяет на int, а при виде my_swap<double> будет создана функция с типом double. Если где-то дальше компилятор опять встретит my_swap<int>, то он ничего генерировать не будет, т.к. код данной функции уже есть(шаблон с данным параметром уже инстанцирован).

Таким образом, если мы инстанцируем этот шаблон три раза с разными типами, то компилятор создаст три разные функции

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

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

рассмотрим вызов функции без указания типа:

int a = 5 ;
int b = 10 ;
my_swap ( a , b ) ;

Наша шаблонная функция принимает параметры типа T&, основываясь на шаблоне, компилятор видит, что Вы передаете в функцию аргументы типа int, поэтому может самостоятельно определить, что в данном месте имеется ввиду функция my_swap с типом int.

Это deducing template arguments. Теперь давайте напишем пример посложнее. Например, программу сортировки массива(будем использовать сортировку «пузырьком»). Естественно, что алгоритм сортировки один и тот же, а вот типы элементов в массиве будут отличаться. Для обменивания значений будем использовать нашу шаблонную функцию my_swap. Приступим:

#include <iostream>
template < typename T >
void my_swap ( T & first , T & second ) //T - тип, указанный в параметре шаблона
{
    T temp(first) ; //временная переменная должна быть того же типа, что и параметры
    first = second ;
    second = temp ;
}
//Функция будет принимать указатель на данные 
//и кол-во элементов массива данных
//Сам алгоритм сортировки можете посмотреть в Интернете.
//Никаких оптимизаций и проверок аргументов применять не будем, нам нужна просто демонстрация.    
template < class ElementType > //Использовал class, но можно и typename - без разницы
void bubbleSort(ElementType * arr, size_t arrSize)
{
    for(size_t i = 0; i < arrSize - 1; ++i) 
        for(size_t j = 0; j < arrSize - 1; ++j)
            if (arr[j + 1] < arr[j]) 
                my_swap ( arr[j] , arr[j+1] ) ;
}
template < typename ElementType >
void out_array ( const ElementType * arr , size_t arrSize )
{
    for ( size_t i = 0 ; i < arrSize ; ++i )
       std::cout << arr[i] << ' ' ;
    std::cout << std::endl ;
}
int main ()
{
    const size_t n = 5 ;
    int arr1 [ n ] = { 10 , 5 , 7 , 3 , 4 } ;
    double arr2 [ n ] = { 7.
62 , 5.56 , 38.0 , 56.0 , 9.0 } ; std::cout << "Source arrays:\n" ; out_array ( arr1 , n ) ;//Компилятор сам выведет параметр шаблона исходя из первого аргумента функции out_array ( arr2 , n ) ; bubbleSort ( arr1 , n ) ; bubbleSort ( arr2 , n ) ; std::cout << "Sorted arrays:\n" ; out_array ( arr1 , n ) ; out_array ( arr2 , n ) ; }

Вывод программы:

Source arrays: 10 5 7 3 4 7.62 5.56 38 56 9 Sorted arrays: 3 4 5 7 10 5.56 7.62 9 38 56

Как видите, компилятор сам генерирует out_array для необходимого типа. Так же он сам генерирует функцию bubbleSort. А в bubbleSort у нас применяется шаблонная функция my_swap, компилятор сгенерирует и её код автоматически. Удобно, не правда ли?

Введение в шаблонные классы

Шаблонными могут быть не только функции. Рассмотрим шаблонные классы. Начнем с простого примера. Мы добавим в наш предыдущий код функцию, которая будет искать максимум и минимум в массиве.

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

struct my_pointer_pair
{
   тип * first ;
   тип * second ;
} ;

А какого же типа будут указатели? Можно сделать их void*, но тогда придется постоянно кастовать их к нужному типу, и код станет похож на «Доширак». А что, если сделать эту структуру шаблонной? Попробуем:

template < typename T, typename U >
struct my_pointer_pair
{
   T * first ;
   U * second ;
}  ;

Теперь компилятор при виде кода my_pointer_pair<тип1,тип2> сам сгенерирует нам код структуры с соответствующими типами. В данном примере указатели у нас будут одинакового типа, но структуру мы сделаем такой, чтобы типы указателей могли быть разными. Это может быть полезно в других примерах (в данном случае я просто хотел показать, что у шаблона может быть не только один параметр).

int main ()
{
    my_pointer_pair<int,double> obj = { new int(10) , new double(67.98) } ;//Создаем объект типа my_pointer_pair<int,double>
    std::cout << *obj.first << ' ' << *obj.second << std::endl ;
    delete obj.first ;
    delete obj.second ;
}

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

Теперь давайте напишем код шаблонной функции для поиска максимума и минимума:

//Шаблон наш будет с одним параметром - тип элементов массива (T)
//Возвращаемое значение - объект типа my_pointer_pair< T , T >
//т.е. first и second в my_pointer_pair будут иметь тип T*.
template < typename T >
my_pointer_pair< T , T > my_minmax_elements (  T * arr , size_t arrSize )
{
    my_pointer_pair< T , T > result = { 0 , 0 } ;
    if ( arr == 0 || arrSize < 1 )
         return result ;
    result. first = arr ;
    result.second = arr ;
    for ( size_t i = 1 ; i < arrSize ; ++i )
    {
        if ( arr[i] < *result.first )
            result.first = arr+i ;
        if ( arr[i] > *result.second )
           result.second = arr+i ;
    }
    return result ;
}

Теперь мы можем вызывать данную функцию:

my_pointer_pair< int , int > mm = my_minmax_elements ( arr1 , n ) ;

Для классов мы должны явно указывать параметры шаблона. В стандарте C++11, устаревшее ключевое слово auto поменяло свое значение и теперь служит для автоматического вывода типа в зависимости от типа инициализатора, поэтому мы можем написать так:

auto mm = my_minmax_elements ( arr1 , n ) ;

Предлагаю написать еще одну функцию, которая будет выводить объект my_pointer_pair в стандартный поток вывода:

template < typename T1 , typename T2 >
void out_pair ( const my_pointer_pair< T1 , T2 > & mp )
{
    if ( mp.first == 0 || mp.second == 0 )
        std::cout << "not found" << std::endl ;
    else
        std::cout << "min = " << *mp. first << " max = " << *mp.second << std::endl ;
}

Теперь соберем всё воедино:

#include <iostream>
template < typename ElementType >
void out_array ( const ElementType * arr , size_t arrSize )
{
    for ( size_t i = 0 ; i < arrSize ; ++i )
       std::cout << arr[i] << ' ' ;
    std::cout << std::endl ;
}
template < typename T, typename U >
struct my_pointer_pair
{
   T * first ;
   U * second ;
}  ;
//Шаблон наш будет с одним параметром - тип элементов массива (T)
//Возвращаемое значение - объект типа my_pointer_pair< T , T >
//т.е. first и second в my_pointer_pair будут иметь тип T*.
template < typename T >
my_pointer_pair< T , T > my_minmax_elements (  T * arr , size_t arrSize )
{
    my_pointer_pair< T , T > result = { 0 , 0 } ;
    if ( arr == 0 || arrSize < 1 )
         return result ;
    result.first = arr ;
    result.second = arr ;
    for ( size_t i = 1 ; i < arrSize ; ++i )
    {
        if ( arr[i] < *result. first )
            result.first = arr+i ;
        if ( arr[i] > *result.second )
           result.second = arr+i ;
    }
    return result ;
}
template < typename T >
void out_pair ( const my_pointer_pair< T , T > & mp )
{
    if ( mp.first == 0 || mp.second == 0 )
        std::cout << "not found" << std::endl ;
    else
        std::cout << "min = " << *mp.first << " max = " << *mp.second << std::endl ;
}
int main ()
{
    const size_t n = 5 ;
    int arr1 [ n ] = { 10 , 5 , 7 , 3 , 4 } ;
    double arr2 [ n ] = { 7.62 , 5.56 , 38.0 , 56.0 , 9.0 } ;
    std::cout << "Arrays:\n" ;
    out_array ( arr1 , n ) ;//Компилятор сам выведет параметр шаблона исходя из первого аргумента функии
    out_array ( arr2 , n ) ;
    out_pair ( my_minmax_elements ( arr1 , n ) ) ;
    out_pair ( my_minmax_elements ( arr2 , n ) ) ;
}

Вывод программы:

Arrays: 10 5 7 3 4 7.62 5.56 38 56 9 min = 3 max = 10 min = 5. 56 max = 56

Шаблоны и STL

В комплекте с компилятором Вам предоставляется стандартная библиотека шаблонов (Standart Template Library). Она содержит множество шаблонных функций и классов. Например, класс двусвязного списка(list), класс «пара» (pair), функция обмена двух переменных(swap), функции сортировок, динамически расширяемый массив(vector) и т.д. Всё это — шаблоны и Вы можете их использовать. Для небольшого примера возьмем std::vector:

#include <vector>
#include <algorithm>
#include <iostream>
int main ()
{
    std::vector <int> arr;
    arr.push_back ( 5 ) ; //Добавляем элемент в конец
    arr.push_back ( 7 ) ;
    arr.push_back ( 3 ) ;
    arr.push_back ( 8 ) ;
    std::cout << "Source vector:\n" ;
    for ( size_t i = 0 , size = arr.size() ; i < size ; ++i )
        std::cout << arr[i] << ' ' ;
    std::cout << std::endl ;
    std::sort ( arr.begin() , arr. end() ) ; //Сортируем вектор
    std::cout << "Sorted vector:\n" ;
    for ( size_t i = 0 , size = arr.size() ; i < size ; ++i )
        std::cout << arr[i] << ' ' ;
   std::cout << std::endl ;
}

Заметьте, когда писали std::vector, авторы понятия не имели, элементы какого типа Вы будете хранить.

Шаблоны это слишком большой и мощный инструмент и описать всё в одной статье не представляется возможным. Это было лишь небольшое введение в мир шаблонов. Углубляясь в шаблоны, Вы поразитесь тому, какой мощный это инструмент и какие возможности он предоставляет.

P.S. высказывайте мнение о статье, критику, дополнения/исправления и интересующие вопросы в комментариях.

P.P.S. Просьба вопросы «консоль закрывается, что делать?», «русский язык не показывает. Что делать?», «как работает сортировка?», «что такое size_t», «что такое std::» и им подобные задавать либо в гугл, либо искать на данном сайте в других статьях. Не нужно захламлять комментарии этой чепухой. Если Вы этого не знаете, то может лучше сначала подтянуть свои знания?

Продолжение: Шаблоны в C++ — часть 2.

Шаблоны C++. Справочник разработчика [Дэвид Вандевурд] (pdf) читать постранично | КулЛиб

Шаблоны C++. Справочник разработчика [Дэвид Вандевурд] (pdf) читать постранично | КулЛиб — Классная библиотека! Скачать книги бесплатно

—  Шаблоны C++. Справочник разработчика  [2-е издание] (пер. И. В. Красиков) 43.62 Мб (скачать pdf) (скачать pdf+fbd)  (читать)  (читать постранично) — Дэвид Вандевурд — Николаи М. Джосаттис — Дуглас Грегор

Книга в формате pdf! Изображения и текст могут не отображаться!

Настройки текста:

Цвет фоначерныйсветло-черныйбежевыйбежевый 2персиковыйзеленыйсеро-зеленыйжелтыйсинийсерыйкрасныйбелыйЦвет шрифтабелыйзеленыйжелтыйсинийтемно-синийсерыйсветло-серыйтёмно-серыйкрасныйРазмер шрифта14px16px18px20px22px24pxШрифтArial, Helvetica, sans-serif»Arial Black», Gadget, sans-serif»Bookman Old Style», serif»Comic Sans MS», cursiveCourier, monospace»Courier New», Courier, monospaceGaramond, serifGeorgia, serifImpact, Charcoal, sans-serif»Lucida Console», Monaco, monospace»Lucida Sans Unicode», «Lucida Grande», sans-serif»MS Sans Serif», Geneva, sans-serif»MS Serif», «New York», sans-serif»Palatino Linotype», «Book Antiqua», Palatino, serifSymbol, sans-serifTahoma, Geneva, sans-serif»Times New Roman», Times, serif»Trebuchet MS», Helvetica, sans-serifVerdana, Geneva, sans-serifWebdings, sans-serifWingdings, «Zapf Dingbats», sans-serif

Насыщенность шрифтажирныйОбычный стилькурсивШирина текста400px500px600px700px800px900px1000px1100px1200pxПоказывать менюУбрать менюАбзац0px4px12px16px20px24px28px32px36px40pxМежстрочный интервал18px20px22px24px26px28px30px32px

Символов на странице: Страница:
  • 1
  • 2
  • 3
  • . . .
  • последняя (107) »

Шаблоны

ВТОРОЕ ИЗДАНИЕ

Templates
The Complete Guide
SECOND EDITION
David VANDEVOORDE
Nicolai M. JOSUTTIS
Douglas GREGOR

Л Addison-Wesley
Boston • Columbus • Indianapolis • New York • San Francisco • Amsterdam • Cape Town
Dubai • London • Madrid • Milan • Munich • Paris • Montreal • Toronto • Delhi • Mexico City
Sao Paulo • Sydney • Hong Kong • Seoul • Singapore • Taipei • Tokyo

Шаблоны
Справочник
разработчика
ВТОРОЕ ИЗДАНИЕ
Дэвид ВАНДЕВУРД

Николаи М. ДЖОСАТТИС
Дуглас ГРЕГОР

дцдпаопика
Москва • Санкт-Петербург
2018

ББК 32.973.26-018.2.75
В17
УДК 681.3.07
Компьютерное издательство “Диалектика”

Перевод с английского и редакция канд. техн. наук И.В. Красикова
Научный консультант канд. физ.-мат. наук Е.А. Зуев

Г1о общим вопросам обращайтесь в издательство “Диалектика» по адресу:
[email protected], http://www.dialektika. com

Вандевурд, Дэвид, Джосаттис, Николаи М., Грегор, Дуглас.
В17

Шаблоны C++. Справочник разработчика, 2-е изд.: Пер. с англ. — СпБ.:
ООО “Альфа-книга”, 2018. — 848 с.: ил. — Парал. гит. англ.

ISBN 978-5-9500296-8-4 (рус.)

ББК 32.973.26-018.2.75
Все названия программных продуктов являются зарегистрированными торговыми марками со­
ответствующих фирм.

Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы
то ни было форме и какими бы то ни было средствами, будь то электронные или механические, вклю­
чая фотокопирование и запись на магнитный носитель, если на это нет письменного разрешения из­
дательства Addison-Wesley Publishing Company, Inc.
Authorized translation from the English language edition published by Addison-Wesley Publishing
Company, Inc,, Copyright© 2018 Pearson Education, Inc.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording or by any information storage retrieval sys­
tem, without permission from the Publisher.

Russian language edition published by Dialektika-Williams Publishing House according to the
Agreement with R&l Enterprises International, Copyright © 2018

Научно-популярное издание
Дэвид Вандевурд, Николаи М. Джосаттис, Дуглас Грегор

Шаблоны C++. Справочник разработчика
2-е издание
Подписано в печать 14.05.2018. Формат 70×100/16
Гарнитура Times
Усл. печ. л. 68,37. Уч.-изд. л. 43,3
Тираж 400 экз. Заказ № 3994

Отпечатано в АО “Первая Образцовая типография”
Филиал “Чеховский Печатный Двор”
142300, Московская область, г. Чехов, ул. Полиграфистов, д. 1
Сайт: www.chpd.ru, E-mail: [email protected], тел. 8 (499) 270-73-59
ООО «Альфа-книга», 195027, Санкт-Петербург, Магнитогорская ул., д. 30, лит. А, пом. 848

ISBN 978-5-9500296-8-4 (рус.)
ISBN 978-0-321-71412-1 (англ.)

© Компьютерное издательство “Диалектика”, 2018,
перевод, оформление, макетирование
© 2018 Pearson Education, Inc.

Оглавление
Предисловие
О книге
Часть!. Основы
Глава 1. Шаблоны функций
Глава 2. Шаблоны классов

Глава 3. Нетиповые параметры шаблонов
Глава 4. Вариативные шаблоны
Глава 5. Основы работы с шаблонами
Глава 6. Семантика перемещения и enable_if
Глава 7. По значению или по ссылке?
Глава 8. Программирование времени компиляции
Глава 9. Применение шаблонов на практике
Глава 10. Основные термины в области шаблонов
Глава 11. Обобщенные библиотеки
Часть II. Углубленное изучение шаблонов

Глава
Глава
Глава
Глава
Глава
Глава

12.
13.
14.
15.
16.
17.

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

22
27

35
37
57
79
89
101
125
141
159
173
189
197

217
219
261
293
321
379
409

Часть III. Шаблоны и проектирование
Глава 18. Полиморфная мощь шаблонов
Глава 19. Реализация свойств типов
Глава 20. Перегрузка свойств типов
Глава 21. Шаблоны и наследование
Глава 22. Статический и динамический полиморфизм
Глава 23. Метапрограммирование
Глава 24. Списки типов
Глава 25. Кортежи
Глава 26. Контролируемые объединения
Глава 27. Шаблоны выражений
Глава 28. Отладка шаблонов

425
427
443
525
551
581
593
613
637
665
693
715

Приложение А. Правило одного определения
Приложение Б. Категории значений
Приложение В. Разрешение перегрузки
Приложение Г. Стандартные утилиты для работы с типами
Приложение Д. Концепты
Библиография
Глоссарий
Предметный указатель

727
737
745
761
803
815
821
833

Содержание
Предисловие
Благодарности ко второму изданию
Благодарности Дэвида ко второму изданию
Благодарности Нико ко второму изданию
Благодарности Дуга ко второму изданию
Благодарности к первому изданию
Благодарности Нико
Благодарности Дэвида

О книге
Что необходимо знать, приступая к чтению этой книги
Структура книги в целом
Как читать эту книгу
Некоторые замечания о стиле программирования
Стандарты С++11, С++14 и С++17
Примечание редактора перевода
Исходные тексты примеров и дополнительная информация
Обратная связь с авторами
Ждем ваших отзывов!

Часть I. Основы
Зачем нужны шаблоны

Глава 1. Шаблоны функций
1.1. Первое знакомство с шаблонами функций
1.1.1. Определение шаблона
1.1.2. Применение шаблонов
1.1.3. Двухэтапная трансляция
1.2. Вывод аргумента шаблона
1.3. Несколько параметров шаблона
1.3.1. Параметр шаблона для возвращаемого типа
1.3.2.


Символов на странице: Страница:
  • 1
  • 2
  • 3
  • . . .
  • последняя (107) »

Преподавательские работы, вакансии воспитателей, школьные вакансии

Преподавательские работы, педагогические вакансии, школьные вакансии | ШколаВесна Выберите местоположение… Любое местоположениеТолько СШАМеждународныйОнлайнАлабамаАляскаАризонаАрканзасКалифорнияКолорадоКоннектикутДелавэрРасст. КолумбияФлоридаГрузияГавайиАйдахоИллинойсИндианаАйоваКанзасКентуккиЛуизианаМэнМэрилендМассачусетсМичиганМиннесотаМиссисипиМиссуриМонтанаНебраскаНевадаНью-ГэмпширНью-ДжерсиНью-МексикоНью-ЙоркСеверная КаролинаСеверная ДакотаОгайоОклахомаОрегонПенсильванияРод-АйлендЮжная КаролинаЮжная ДакотаTenne sseeТехасЮтаВермонтВирджинияВашингтонЗападная ВирджинияВисконсинВайомингВыберите категорию. ..Классный учительАдминистраторЛегкая атлетикаПрофессиональное образованиеУчебная поддержкаСпециальное образованиеУслуги для студентовЗаместительВспомогательный персоналПозиции на уровне штатаОнлайнДругое/СезонныеВыберите класс…Любой уровень класса …Любой тип работыПолная — или неполный рабочий деньПолный рабочий деньНеполный рабочий деньЛетоПосле школы/Вечернее
  • Расширенный поиск
  • Мой сохраненный поиск

Идентификатор задания

Соискатели

Продвиньте свою карьеру в области образования. Это бесплатно.

Если вы только начинаете или уже имеете опыт&запятая; SchoolSpring — лучшее место для управления вашей образовательной карьерой. Получите доступ к тысячам вакансий по всей стране со всего Интернета в одном , Удобная поисковая система. И это только начало. С SchoolSpring&запятая; доступ&двоеточие;

  • Карьера Инструменты управления документами.
  • Централизованная агрегация поиска работы.
  • Оповещения по электронной почте.
  • Комплексные приложения.
  • Найти работу Бесплатная регистрация

Мы обновили нашу Политику конфиденциальности, вступившую в силу 27 января 2020 г.
Щелкните здесь для получения дополнительной информации.

Работодатели


Увеличьте охват и расширьте круг кандидатов.

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

  • Поиск кандидатов из нашего национального резерва.
  • Распространяйте информацию о своих вакансиях на сайтах Indeed, Monster, Teach.org, через Twitter и т. д.
  • Автоматические оповещения по электронной почте, рассылаемые заинтересованным соискателям.
  • Прямая интеграция с TalentEd Recruit & Hire и другими системами отслеживания кандидатов.
  • Разместить вакансию Узнать больше

Ищущие работу

  • Найти работу
  • Мой профайл

Работодатели

  • Разместить вакансию
  • Запросы на продажу

О нас

  • Контакт
  • Карта сайта
  • политика конфиденциальности
  • Условия эксплуатации

Соединять

Преподавательские работы, вакансии воспитателей, школьные вакансии

Преподавательские работы, педагогические вакансии, школьные вакансии | ШколаВесна Выберите местоположение… Любое местоположениеТолько СШАМеждународныйОнлайнАлабамаАляскаАризонаАрканзасКалифорнияКолорадоКоннектикутДелавэрРасст. КолумбияФлоридаГрузияГавайиАйдахоИллинойсИндианаАйоваКанзасКентуккиЛуизианаМэнМэрилендМассачусетсМичиганМиннесотаМиссисипиМиссуриМонтанаНебраскаНевадаНью-ГэмпширНью-ДжерсиНью-МексикоНью-ЙоркСеверная КаролинаСеверная ДакотаОгайоОклахомаОрегонПенсильванияРод-АйлендЮжная КаролинаЮжная ДакотаTenne sseeТехасЮтаВермонтВирджинияВашингтонЗападная ВирджинияВисконсинВайомингВыберите категорию. ..Классный учительАдминистраторЛегкая атлетикаПрофессиональное образованиеУчебная поддержкаСпециальное образованиеУслуги для студентовЗаместительВспомогательный персоналПозиции на уровне штатаОнлайнДругое/СезонныеВыберите класс…Любой уровень класса …Любой тип работыПолная — или неполный рабочий деньПолный рабочий деньНеполный рабочий деньЛетоПосле школы/Вечернее
  • Расширенный поиск
  • Мой сохраненный поиск

Идентификатор задания

Соискатели

Продвиньте свою карьеру в области образования. Это бесплатно.

Если вы только начинаете или уже имеете опыт&запятая; SchoolSpring — лучшее место для управления вашей образовательной карьерой. Получите доступ к тысячам вакансий по всей стране со всего Интернета в одном , Удобная поисковая система. И это только начало. С SchoolSpring&запятая; доступ&двоеточие;

  • Карьера Инструменты управления документами.
  • Централизованная агрегация поиска работы.
  • Оповещения по электронной почте.
  • Комплексные приложения.
  • Найти работу Бесплатная регистрация

Мы обновили нашу Политику конфиденциальности, вступившую в силу 27 января 2020 г.
Щелкните здесь для получения дополнительной информации.

Работодатели


Увеличьте охват и расширьте круг кандидатов.

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

  • Поиск кандидатов из нашего национального резерва.
  • Распространяйте информацию о своих вакансиях на сайтах Indeed, Monster, Teach.org, через Twitter и т. д.
  • Автоматические оповещения по электронной почте, рассылаемые заинтересованным соискателям.

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

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