c++. полезное
|
|
patron | Дата: Среда, 09.09.2015, 21:35 | Сообщение # 1 |
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Статус: Offline
| Определить четность x
!(x%2) ? printf("%d",x) : printf("No");
|
|
| |
patron | Дата: Четверг, 10.09.2015, 20:54 | Сообщение # 2 |
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Статус: Offline
| Пузырьковая сортировка, для контейнеров, без временных переменных:
template <typename T > void bubble_sort( T &a ) { for( T::size_type i = 0; a.size() && i < a.size() - 1; ++i ) { for( T::size_type j = i; j + 1 > 0; --j ) { if( a > a[j+1] ) std::swap( a, a[j+1] ); } } }
std::vector<int> v; v.push_back( 7 ); v.push_back( 1000 ); v.push_back( 134 ); v.push_back( 23 ); v.push_back( 1 ); bubble_sort( v );
|
|
| |
patron | Дата: Пятница, 11.09.2015, 20:04 | Сообщение # 3 |
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Статус: Offline
| Код переворота строки для контейнеров, без временных переменных, не осуществляющий прохода по всей строке:
template <typename T > void invert_string( T &a ) { T::size_type length = a.size(); for( T::size_type i = 0; i < (length/2); ++i ) { std::swap( a, a[length - i - 1] ); } }
std::string str = "abcdefg"; invert_string(str);
|
|
| |
patron | Дата: Понедельник, 14.09.2015, 20:18 | Сообщение # 4 |
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Статус: Offline
| Приведение типов в стиле языка C
Приведение типов в стиле языка C может привести выражение любого типа к любому другому типу данных (исключение это приведение пользовательских типов по значению, если не определены правила их приведения, а также приведение вещественного типа к указателю или наоборот). К примеру, unsigned int может быть преобразован к указателю на double. Данный метод приведения типов может быть использован в языке C++. Однако, метод приведения типов в стиле языка C не делает проверки типов на совместимость, как это могут сделать static_cast и dynamic_cast на этапе компиляции и на этапе выполнения соответственно. При этом все, что умеют const_cast и reinterpret_cast данный метод приведения типов делать может.
Общий вид приведения:
(new_type)exp
, где new_type – новый тип, к которому приводим, а exp – выражение, которое приводится к новому типу.
Т.к. данный оператор не имеет зарезервированного ключевого слова (например, static_cast) найти все места приведения типов в тексте программы будет не очень удобно, если это потребуется.
#include <iostream> //Пустые классы только //для теста приведения struct AAA{ }; struct BBB{ }; //Наследники BBB struct BBB_X:BBB{ }; struct BBB_Y:BBB{ };
int main() { //Переменные простых типовы и указатели на переменные простых типов int i = 5; double d = 111.222; char c = 'a'; int* pi = &i; double * pd = &d; const int* cpi = &i; void* v = NULL; //Объекты классов AAA A; BBB B; BBB_X BX; BBB_Y BY; //Указатели на объекты классов AAA* pA = &A; BBB* pB = &B; BBB_X* pBX = &BX; BBB_Y* pBY = &BY; //Приводим явно double к int i = (int)d; //и наоборот d = (double)i; //указатель на int к char c = (char)pi; //char к указателю на void v = (void*)c; //указатель на void к указателю на int pi = (int*)v; //Снимаем константность const int* pi = (int *) cpi; //Приводим указатель на объект AAA к указателю на объект BBB //из разных иерархий pA = (AAA*) pB; //Приводим указатель на double к double d = (double)pd;//Ошибка!!! //А если наоборот? pd = (double*)d;//Ошибка!!! //Перемещение из одной иерархии наследования в другую pB = (BBB*)pBX; pBY = (BBB_Y*) pB; return 0; }
|
|
| |
patron | Дата: Среда, 16.09.2015, 21:06 | Сообщение # 5 |
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Статус: Offline
| const_cast
Оператор приведения const_cast удаляет или добавляет квалификаторы const и volatile с исходного типа данных (простые типы, пользовательские типы, указатели, ссылки). Например, был const int, а после преобразования стал int или наоборот. Квалификаторы const и volatile называют cv-квалификаторы (cv-qualifiers). Данные квалификаторы указываются перед именами типов. Как ни трудно догадаться квалификатор const задает константность, т.е. защищает переменную от изменения. Квалификатор volatile говорит о том, что значение переменной может меняться без явного выполнения присваивания. Это обеспечивает защиту от оптимизации компилятором операций с данной переменной.
Общий вид приведения:
const_cast<new_type>(exp)
|
|
| |
patron | Дата: Среда, 16.09.2015, 21:06 | Сообщение # 6 |
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Статус: Offline
| #include <iostream> //Снятие константности void test_func_X(const int* in1, const int& in2) { int *p; //Сняли константность и записали 33 p = const_cast<int*>(in1); *p = 33; //Сняли константность и записали 55 const_cast<int&>(in2) = 55; } //Добавление константности void test_func_Y(int* in1, int& in2) { const int *p; //Добавили константность //и пытаемся записать 33 p = const_cast<const int*>(in1); *p = 33;//Ошибка !!! //Добавили константность константность //и пытаемся записалть 33 const_cast<const int&>(in2) = 55;//Ошибка!!! } //Снятие volatile void test_func_Z(volatile int* in1, volatile int& in2) { int *p; //Сняли volatile и записали 33 p = const_cast<int*>(in1); *p = 33; //Сняли volatile и записали 55 const_cast<int&>(in2) = 55; } //Добавление volatile void test_func_A(int* in1, int& in2) { volatile int *p; //Добавили volatile и записали 33 p = const_cast<volatile int*>(in1); *p = 33; //Добавили volatile и записали 55 const_cast<volatile int&>(in2) = 55; }
int main() { int x=3,y=5; std::cout<<x<<" "<<y<<std::endl; //Снимаем константность test_func_X(&x,y); std::cout<<x<<" "<<y<<std::endl; x=3; y=5; //Добавляем константность test_func_Y(&x,y);//Ошибка!!! std::cout<<x<<" "<<y<<std::endl; //Снимаем volatile test_func_Z(&x,y); std::cout<<x<<" "<<y<<std::endl; x=3; y=5; std::cout<<x<<" "<<y<<std::endl; //Добавляем volatile test_func_A(&x,y); std::cout<<x<<" "<<y<<std::endl; system("pause"); return 0; }
|
|
| |
patron | Дата: Воскресенье, 20.09.2015, 14:49 | Сообщение # 7 |
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Статус: Offline
| reinterpret_cast
Оператор приведения reinterpret_cast используется для приведения несовместимых типов. Может приводить целое число к указателю, указатель к целому числу, указатель к указателю (это же касается и ссылок). Является функционально усеченным аналогом приведения типов в стиле языка С. Отличие состоит в том, что reinterpret_cast не может снимать квалификаторы const и volatile, а также не может делать небезопасное приведение типов не через указатели, а напрямую по значению. Например, переменную типа int к переменной типа double привести при помощи reinterpret_cast нельзя.
Общий вид приведения:
reinterpret_cast<new_type>(exp)
|
|
| |
patron | Дата: Воскресенье, 20.09.2015, 14:50 | Сообщение # 8 |
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Статус: Offline
| #include <iostream> //Пустые классы только //для теста приведения struct AAA{ }; struct BBB{ }; //Наследники BBB struct BBB_X:BBB{ }; struct BBB_Y:BBB{ };
int main() { //Переменные простых типовы и указатели на переменные простых типов int i = 5; double d = 111.222; char c = 'a'; int* pi = &i; double * pd = &d; const int* cpi = &i; void* v = NULL; //Объекты классов AAA A; BBB B; BBB_X BX; BBB_Y BY; //Указатели на объекты классов AAA* pA = &A; BBB* pB = &B; BBB_X* pBX = &BX; BBB_Y* pBY = &BY; //Приводим явно double к int i = reinterpret_cast<int>(d);//Ошибка!!! //и наоборот /d = reinterpret_cast<int>(i);//Ошибка!!! //указатель на int к char c = reinterpret_cast<char>(pi); //char к указателю на void v = reinterpret_cast<void*>©; //указатель на void к указателю на int pi = reinterpret_cast<int*>(v); //Снимаем константность const int* pi = reinterpret_cast<int *>(cpi);//Ошибка!!! //Приводим указатель на объект AAA к указателю на объект BBB //из разных иерархий pA = reinterpret_cast<AAA*>(pB); //Приводим указатель на double к double d = reinterpret_cast<double>(pd);//Ошибка!!! //А если наоборот? pd = reinterpret_cast<double*>(d0;//Ошибка!!! //Перемещение из одной иерархии наследования в другую pB = reinterpret_cast<BBB*>(pBX); pBY = reinterpret_cast<BBB_Y*>(pB); return 0; }
|
|
| |