vector删除元素 图片看不了?点击切换HTTP 返回上层
1 2 | std::vector< int > data(100, 99);// Contains 100 elements initialized to 99 data.clear(); // Remove all elements |
可以使用 vector 的成员函数 pop_back() 来删除容器尾部的元素。例如:
1 2 | std::vector< int > data(100, 99); // Contains 100 elements initialized to 99 data.pop_back(); // Remove the last element |
1 2 | std::swap(std:: begin (data)+1,std:: end (data)-1); // Interchange 2nd element with the last data.pop_back(); // Remove the last element |
注意,vector 也有成员函数 swap(),这个函数用来交换两个 vector 容器中的元素。显然,这两个容器的元素类型必须相同。全局的 swap() 函数只要将两个容器作为参数,也可以交换它们的元素。
如果要去掉容器中多余的容量,例如不再向容器中添加新元素,那么可以通过使用成 员函数 shrink_to_fit() 来实现:
1 | data.shrink_to_fit(); // Reduce the capacity to that needed for elements |
可以使用成员函数 erase() 来删除容器中的一个或多个元素。如果只删除单个元素,那么只需要提供一个参数,例如:
1 | auto iter = data.erase(std:: begin (data)+1); // Delete the second element |
如果要移除一个元素序列,只需要传入两个迭代器,用来指定移除元素的范围。例如:
1 2 | // Delete the 2nd and 3rd elements auto iter = data.erase(std:: begin (data)+1,std:: begin (data)+3); |
remove() 算法由定义在 algorithm 头文件中的模板生成,它可以删除匹配特定值的一段元素。例如:
1 2 | std::vector<std::string> words { "one" , "none" , "some" , "all”, " none ", " most "," many "}; auto iter = std::remove(std::begin(words), std::end(words), " none"); |

图 1 remove() 算法的工作原理
如果在 remove() 操作后输出 words 中的元素,只会输出前 5 个元素。尽管 size() 返回的值仍然是 7,而且最后两个元素仍然存在,但是它们被替换成了空字符串对象。为了摆脱这些多余的元素,可以使用成员函数 erase()。remove() 返回的迭代器可以这样使用:
1 | words.erase(iter, std:: end (words));//Remove surplus elements |
1 | words.erase(std::remove(std:: begin (words), std:: end (words), "none" ), std:: end (words)); |
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 | // Understanding how capacity is increased in a vector container #include <iostream> // For standard streams #include <vector> // For vector container int main() { std::vector <size_t> sizes; // Record numbers of elements std::vector <size_t> capacities; // and corresponding capacities size_t el_incr {10}; // Increment to initial element count size_t incr_count {4 * el_incr}; // Number of increments to element count for (size_t n_elements {}; n_elements < incr_count; n_elements += el_incr) { std::vector< int > values (n_elements); std::cout << "\nAppending to a vector with " << n_elements << " initial elements:\n" ; sizes.push_back( values . size ()); size_t space { values .capacity()}; capacities.push_back( space ); // Append elements to obtain capacity increases size_t count {}; // Counts capacity increases size_t n_increases {10}; while ( count < n_increases) { values .push_back(22); // Append a new element if ( space < values .capacity()) // Capacity increased... { // ...so record size and capacity space = values .capacity(); capacities.push_back( space ); sizes.push_back( values . size ()); ++ count ; } } // Show sizes & capacities when increments occur std::cout << "Size/Capacity: " ; for (size_t i {}; i < sizes. size (); ++i) std::cout << sizes. at (i) << "/" << capacities. at (i) << " " ; std::cout << std::endl; sizes.clear(); // Remove all elements capacities.clear(); // Remove all elements } } |
Appending to a vector with 0 initial elements:
Size/Capacity: 0/0 1/1 2/2 3/4 5/8 9/16 17/32 33/64 65/128 129/256 257/512
Appending to a vector with 10 initial elements:
Size/Capacity: 10/10 11/20 21/40 41/80 81/160 161/320 321/640 641/1280 1281/2560 2561/5120 5121/10240
Appending to a vector with 20 initial elements:
Size/Capacity: 20/20 21/40 41/80 81/160 161/320 321/640 641/1280 1281/2560 2561/5120 5121/10240 10241/20480
Appending to a vector with 30 initial elements:
Size/Capacity: 30/30 31/60 61/120 121/240 241/480 481/960 961/1920 1921/3840 3841/7680 7681/15360 15361/30720
假设生成了一个初始容量为 1000 个元素的 vector,但实际上存储了 1001 个元素。这样就会有用于 499 个元素的多余容量。如果元素是数组或其他不会占用太多空间的对象,这不会有任何问题。但是如果对象非常大,例如每个 10KB,那么程序需要分配几乎 5MB 的多余内存。所以,最好可以稍微高估 vector 的初始大小,而不能低估。
当然,也能自己管理内存的分配。可以比较容器的大小和容量,当需要内存时,就可以通过容器的 reserve() 函数来增加容器的容量。例如:
1 2 3 4 5 6 7 | std::vector <size_t> junk {1, 2, 3}; for (size_t i {} ; i<1000 ; ++i) { if(junk. size () == junk.capacity()) // When the size has reached the capacity... junk.reserve(junk. size 0*13/10); // ...increase the capacity junk.push_back(i); } |