1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//Листинг #1 clang Ошибка в представлении себе ассоциативных контейнеров #include <iostream> #include <set> using namespace std; int main() { set<int> s; for (int i=0; i<10; i++){ s.insert(i); } for (const auto &i: s){ cout << i << ' '; } s.find(5) = 10; //Нельзя проделать нечто подобное } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//Листинг #2 clang Переписываем значение в set //clang 6.0.0 #include <iostream> #include <set> using namespace std; int main() { set<int> s; for (int i=0; i<10; i++){ s.insert(i); } cout << "before:\n"; for (const auto &i: s){ cout << i << ' '; } set<int>::iterator it = s.find(5); //Находим точку переназначения s.erase(it); //Удаляем это значение из массива s.insert(10); //Вставляем в массив нужное значение cout << "\nafter:\n"; for (const auto &i: s){ cout << i << ' '; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Листинг #3 clang 6.0.0 Использование собственного порядка в set #include <iostream> #include <set> using namespace std; /*ФУНКТОР-компаратор*/ struct My_Comparator{ bool operator ()(const int x, const int y) const{ return x < y; //определяем условие сравнения } }; int main() { set<int, My_Comparator> s; //Указываем ФУНКТОР-компаратор в момент объявления } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
//Листинг #4.1 clang 6.0.0 Новичок усекает set использованием вспомогательного set (очень плохой подход) #include <iostream> #include <set> using namespace std; void print(const set<int> s, const char* info){ if (s.empty()){ cout << "empty\n"; return; } cout << "\nstart " << info << '\n'; for (const auto &i: s){ cout << i << ' '; } cout << "\nend " << info << "\n\n"; } int main() { set<int> s; for (int i=0; i<100; i++){ s.insert(i); } print(s, "before"); set<int> temp_set(s); set<int>::iterator cursor = s.end(); //текущий элемент set<int>::iterator start_erase = s.begin(); //точка начала среза set<int>::iterator temp; //вспогательный итератор int N = 9; //Будем отсекать всё после девятого элемента /*устанавливаем итераторы на позиции*/ cursor--; //ставим курсор на последний элемент advance(start_erase, N); //устанавливаем место среза /*отсекаем элементы*/ if (N < s.size()){ while ( (temp != start_erase) ){ temp = cursor; cursor--; s.erase(temp); } } else { cout << "нельзя отсечь что-то за пределами массива\n"; } print(s, "after"); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
//Листинг #4.2 clang 6.0.0 Новичок усекает set удалением копированием и использованием вспомогательного set #include <iostream> #include <set> using namespace std; void print(const set<int> s, const char* info){ if (s.empty()){ cout << "empty\n"; return; } cout << "\nstart " << info << '\n'; for (const auto &i: s){ cout << i << ' '; } cout << "\nend " << info << "\n\n"; } int main() { set<int> s; for (int i=0; i<100; i++){ s.insert(i); } print(s, "after"); int N = 50; //отсекаем всё после указанной позиции set<int> temp; //вспомогательный массив set<int>::iterator it = s.begin(); //итератор для пощиционирования по массиву /*ЗАПОЛНЯЕМ МАССИВ ЗНАЧЕНИЯМИ В НУЖНОМ КОЛИЧЕСТВЕ*/ for (int i=0; i<N; i++){ temp.insert(*it); it++; } swap(s, temp); //меняем местами temp.clear(); //удаляем print(s, "after"); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//Листинг #4.3 clang 6.0.0 Усекчение set удалением копированием с использованием вспомогательного set #include <iostream> #include <set> using namespace std; void print(const set<int> s, const char* info){ if (s.empty()){ cout << "empty\n"; return; } cout << "\nstart " << info << '\n'; for (const auto &i: s){ cout << i << ' '; } cout << "\nend " << info << "\n\n"; } int main() { set<int> s; for (int i=1; i<100; i++){ s.insert(i); } print(s, "before"); int N = 20; set<int> temp; copy_n(s.begin(), N, inserter(temp, temp.end())); //Откуда, сколько, и как бы вставляем итераторы в создаваемый массив print(temp, "after"); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Листинг #aa #include <iostream> #include <iterator> #include <set> #include <algorithm> using namespace std; int main(){ set<int> s{1, 2, 3}; set<int> s2{4, 5, 6}; copy(s.begin(), s.end(), inserter(s2, s2.begin())); //Вставляем диапазон [s.begig()...s.end()] в s2 for (const auto &i: s2){ cout << i << ' '; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//Листинг #ab #include <iostream> #include <iterator> #include <vector> #include <algorithm> using namespace std; int main(){ vector<int> s{1, 2, 3}; vector<int> s2{4, 5, 6}; //вставим весь s2 во вторую позицию s //1 4 5 6 2 3 auto it = s.begin(); advance(it, 1); //определяем позицию вставки на уровне итераторов copy(s2.begin(), s2.end(), inserter(s, it)); //вставляем s2 в s с позиции it for (const auto &i: s){ cout << i << ' '; } } |
Добавить комментарий