c++的vector、list、set、map及其成员函数已经足够我们大多数应用了,

但是,

c++11增加的algorithm配合container可谓所向披靡。

vector<int> vec = { 1, 2, 3, 4, 5, 6 }, out;

std::copy_if:将容器中符合要求的元素复制到另一个容器

std::copy_if(vec.begin(), 
                 vec.end(), 
                 std::back_inserter(out), 
                 // 在out的结尾插入。如果是开头,使用std::front_inserter
                 [](int it)->bool { 
    return it % 2 == 1; 
});

std::remove_if:将待删除的元素全都移动到容器的尾部

auto iterator = 
    std::remove_if(vec.begin(), 
                         vec.end(), 
                         [](int it)->bool { 
    return it % 2 == 1; 
});

此时容器内容为2,4,6,1,3,5,iterator指向1

vec.erase(iterator, vec.end());  // 删除1,3,5

为什么std::remove_if没有删除元素而是仅将待删除元素移到容器尾部呢?

因为删除元素会导致容器发生变化,如vector会拷贝元素,这将大大影响效率。

std::reverse:将容器的元素逆转

std::sort:排序

auto compare = []()->bool {};

返回true,表示升序排列;返回false表示降序排列。

特别注意:比较函数必须确定,不能出现二义性(某些情况a大于b,另些情况a小于b)。

更多算法请参见:http://www.cplusplus.com/reference/algorithm/

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐