1 #include <vector> 2 #include <list> 3 #include <algorithm> 4 #include <iostream> 5 using namespace std; 6 7 void main() 8 { 9 //拷贝数据,与反向拷贝 10 { 11 vector<int> myint{ 1,2,3,4,5 }; 12 list<int> mylist{ 6,7,8,9,10 }; 13 //指定长度进行拷贝(注意,不会把容器长度增长) 14 /*copy(myint.begin(), myint.end()-2, mylist.begin());*/ 15 //从尾部到头部进行拷贝(反向拷贝) 16 copy_backward(myint.begin(), myint.end(), mylist.end()); 17 for (auto i : mylist) 18 { 19 cout << i << endl; 20 } 21 } 22 23 //交换数据 24 { 25 double a = 10; 26 double b = 20; 27 swap(a, b); 28 cout << a << b << endl; 29 } 30 31 //交换容器 32 { 33 vector<int> myint{ 1,2,3,4 }; 34 vector<int> mynewint{ 6,7,8,9 }; 35 list<int> mylist{ 1,2,3,9 }; 36 swap(myint, mynewint);//交换数据 37 //类型不一致,不允许交换数据 38 //swap(myint,mylist); 39 } 40 41 //交换指针 42 { 43 int a = 5; 44 int b = 10; 45 //交换指针的地址 46 iter_swap(&a, &b); 47 cout << a << b << endl; 48 } 49 50 //交换容器中的两个数据 51 { 52 vector<int> myint{ 1,2,3,4,5 }; 53 54 iter_swap(myint.begin(), myint.begin() + 2); 55 for (auto i : myint) 56 { 57 cout << i << endl; 58 } 59 } 60 61 //交换两个容器间的一部分 62 { 63 vector<int> myint1{ 1,2,3,4 }; 64 vector<int> myint2{ 6,7,8,9 }; 65 //交换部分 66 swap_ranges(myint1.begin(), myint1.begin() + 2, myint2.begin() + 2); 67 68 for (auto i : myint2) 69 { 70 cout << i << endl; 71 } 72 } 73 74 //批量修改容器中的元素 75 { 76 vector<int> myint{ 1,2,3,4,5 }; 77 transform(myint.begin(), myint.end(), myint.begin(), [](int x) {return x * x; }); 78 for (auto i : myint) 79 { 80 cout << i << endl; 81 } 82 } 83 84 //批量替换 85 { 86 vector<int> myint{ 1,2,3,4,5,1,2,3,4 }; 87 replace(myint.begin(), myint.end(), 3, 300); 88 for (auto i : myint) 89 { 90 cout << i << endl; 91 } 92 } 93 94 //根据条件全部替换 95 { 96 vector<int> myint{ 1,2,3,4,5,1,2,3,4 }; 97 replace_if(myint.begin(), myint.end(), [](int x)->bool {return x % 2; }, 0); 98 for (auto i : myint) 99 { 100 cout << i << endl; 101 } 102 } 103 104 //批量替换到副本中 105 { 106 vector<int> myint{ 1,2,3,4,5,1,2,3,4 }; 107 vector<int> myintlast{ 0,0,0,0,0,0,0,0,0 }; 108 replace_copy(myint.begin(), myint.end(), myintlast.begin(), 3, 300); 109 for (auto i : myintlast) 110 { 111 cout << i << endl; 112 } 113 } 114 115 //根据条件全部替换到副本中 116 { 117 vector<int> myint{ 1,2,3,4,5,1,2,3,4 }; 118 vector<int> myintlast{ 0,0,0,0,0,0,0,0,0 }; 119 replace_copy_if(myint.begin(), myint.end(), myintlast.begin(), [](int x)->bool {return x % 2; }, 0); 120 for (auto i : myintlast) 121 { 122 cout << i << endl; 123 } 124 } 125 126 //填充一个容器 127 { 128 vector<int> myint{ 1,2,3,4,5,1,2,3,4 }; 129 vector<int> myintlast{ 0,0,0,0,0,0,0,0,0 }; 130 fill(myintlast.begin(), myintlast.end(), 199); 131 132 fill_n(myint.begin(), 3, 100); 133 for (auto i : myintlast) 134 { 135 cout << i << endl; 136 } 137 138 for (auto i : myint) 139 { 140 cout << i << endl; 141 } 142 } 143 144 //删除容器中指定的数据(不是彻底删除,删除后从后往前移动) 145 { 146 vector<int> myint{ 1,2,3,4,5,1,2,3,4 }; 147 vector<int> myintlast{ 0,0,0,0,0,0,0,0,0 }; 148 149 //it保存最后一个元素的位置 150 auto it = remove(myint.begin(), myint.end(), 3); 151 //此种方式会显示后面的空间的数据 152 /*for (auto i : myint) 153 { 154 cout << i << endl; 155 }*/ 156 for (auto ib = myint.begin(); ib != it; ib++) 157 { 158 cout << *ib << endl; 159 } 160 } 161 162 //删除容器中满足条件的数据(不是彻底删除,删除后从后往前移动) 163 { 164 vector<int> myint{ 1,2,3,4,5,1,2,3,4 }; 165 vector<int> myintlast{ 0,0,0,0,0,0,0,0,0 }; 166 167 //it保存最后一个元素的位置 168 auto it = remove_if(myint.begin(), myint.end(), [](int x)->bool {return x % 2; }); 169 //此种方式会显示后面的空间的数据 170 /*for (auto i : myint) 171 { 172 cout << i << endl; 173 }*/ 174 for (auto ib = myint.begin(); ib != it; ib++) 175 { 176 cout << *ib << endl; 177 } 178 } 179 180 //对副本进行删除 181 { 182 vector<int> myint{ 1,2,3,4,5,1,2,3,4 }; 183 vector<int> myintlast; 184 for (int i = 0; i < 9; i++) 185 { 186 myintlast.push_back(0); 187 } 188 189 remove_copy(myint.begin(), myint.end(), myintlast.begin(), 3); 190 for (auto i : myintlast) 191 { 192 cout << i << endl; 193 } 194 195 } 196 197 //拷贝的时候删除连续重复的 198 { 199 vector<int> myint{ 1,2,3,4,5,1,2,3,4 }; 200 unique(myint.begin(), myint.end()); 201 for (auto i : myint) 202 { 203 cout << i << endl; 204 } 205 } 206 207 //拷贝的时候删除连续重复的(对副本) 208 { 209 vector<int> myint{ 1,2,3,4,5,1,2,3,4 }; 210 int a[9]{ 0 }; 211 unique_copy(myint.begin(), myint.end(), a); 212 for (auto i : a) 213 { 214 cout << i << endl; 215 } 216 } 217 218 //容器反转 219 { 220 vector<int> myint{ 1,2,3,4,5,1,2,3,4 }; 221 reverse(myint.begin(), myint.end()); 222 for (auto i : myint) 223 { 224 cout << i << endl; 225 } 226 } 227 228 229 230 //区间交换到副本中 231 { 232 vector<int> myint{ 1,2,3,4,5,6,7,8,9 }; 233 rotate(myint.begin(), myint.begin() + 4, myint.end()); 234 for (auto i : myint) 235 { 236 cout << i << endl; 237 } 238 } 239 240 //区间交换 241 { 242 vector<int> myint{ 1,2,3,4,5,6,7,8,9 }; 243 int a[9]{ 0 }; 244 //begin取数组的头结点 245 rotate_copy(myint.begin(), myint.begin() + 4, myint.end(), begin(a)); 246 for (auto i : a) 247 { 248 cout << i << endl; 249 } 250 } 251 252 //洗牌算法 253 { 254 vector<int> myint{ 1,2,3,4,5,6,7,8,9 }; 255 random_shuffle(myint.begin(), myint.end()); 256 for (auto i : myint) 257 { 258 cout << i << endl; 259 } 260 } 261 262 //根据条件进行分段(例如小的在左边,大的在右边) (相对顺序会发生变化) 263 { 264 vector<int> myint{ 1,9,2,8,3,7,4,6,5,10 }; 265 //it的位置是分界点 266 auto it = partition(myint.begin(), myint.end(), [](int x)->int {return x <= 5 ? 1 : 0; }); 267 for (auto i : myint) 268 { 269 cout << i << endl; 270 } 271 } 272 273 //根据条件进行分段(对副本进行操作)(例如小的在一个容器,大的在一个容器) (相对顺序会发生变化) 274 { 275 vector<int> myint{ 1,9,2,8,3,7,4,6,5,10 }; 276 vector<int> myintX{ 0,0,0,0,0,0,0,0,0,0 }; 277 vector<int> myintY{ 0,0,0,0,0,0,0,0,0,0 }; 278 279 //两段分别拷贝到两个容器 280 auto it = partition_copy(myint.begin(), myint.end(),myintX.begin(),myintY.begin(), [](int x)->int {return x <= 5 ? 1 : 0; }); 281 for (auto i : myintX) 282 { 283 cout << i << endl; 284 } 285 286 for (auto i : myintY) 287 { 288 cout << i << endl; 289 } 290 } 291 292 //根据条件进行分段(例如小的在左边,大的在右边) (相对顺序不发生变化) 293 { 294 vector<int> myint{ 1,9,2,8,3,7,4,6,5,10 }; 295 //it的位置是分界点 296 auto it = stable_partition(myint.begin(), myint.end(), [](int x)->int {return x <= 5 ? 1 : 0; }); 297 for (auto i : myint) 298 { 299 cout << i << endl; 300 } 301 } 302 303 //填充 304 { 305 vector<int> myint(10); 306 //指定数据填充 307 generate(myint.begin(), myint.end(), []() {return 10; }); 308 //随机数填充 309 generate(myint.begin(), myint.end(), rand); 310 //指定位置填充n个 311 generate_n(myint.begin()+2, 3, rand); 312 for (auto i : myint) 313 { 314 cout << i << endl; 315 } 316 317 } 318 319 cin.get(); 320 }