最有用或最惊人的STL短衬里

23 c++ stl

我正在寻找几行C++/STL代码的实用和教育样本.我最喜欢的是:

  1. 清空一个释放其保留内存的向量:

    vector <...>().swap (v)
    
    Run Code Online (Sandbox Code Playgroud)

    (临时交换)

  2. 将地图复制到矢量:

    map<T1, T2> myMap;
    vector< pair<T1, T2> > myVec(myMap.begin(), myMap.end());
    // or
    myVec.assign(myMap.begin(), myMap.end());
    
    Run Code Online (Sandbox Code Playgroud)
  3. 自定义,非增强分割:

    vector<string> &mysplit(const string &s, char delim, vector<string> &elems) {
        stringstream ss(s);
        string item;
        while(getline(ss, item, delim)) { elems.push_back(item); }
        return elems;
    }
    
    Run Code Online (Sandbox Code Playgroud)

Mar*_*ork 13

我最喜欢的是将容器复制到输出:并将输入流复制到容器中.

#include <vector>
#include <algorithm> 
#include <iterator>
#include <iostream>

int main()
{
    std::vector<int>   data;
    std::copy(std::istream_iterator<int>(std::cin),
              std::istream_iterator<int>(),
              std::back_inserter(data)
             );

    std::copy(data.begin(),data.end(),
              std::ostream_iterator<int>(std::cout,"\n")
             );
}
Run Code Online (Sandbox Code Playgroud)


j_r*_*ker 7

实际删除由remove()or 删除的元素需要以下习语remove_if():

vector<int> v;
...
v.erase(remove(v.begin(), v.end(), 42), v.end());
Run Code Online (Sandbox Code Playgroud)

remove()然后remove_if()向前滑动未删除的元素并报告新范围结束的位置 - 它们不会(也不能)删除它们,因为它们可以在任意迭代器范围内工作,而不仅仅是容器.


bay*_*yda 6

// std::back_inserter usage ( std::inserter for map )
std::copy( source.begin(), source.end(), std::back_inserter( container ) );  
Run Code Online (Sandbox Code Playgroud)

-

// mem_fun and bind usage (but boost better)
std::some_algorithm(..., std::mem_fun( func ) );  
Run Code Online (Sandbox Code Playgroud)

没那么有用,但功能强大:

检查是容器分类

std::adjacent_find( container.begin(), container.end(), greater<Container::value_type>() ) == container.end()
Run Code Online (Sandbox Code Playgroud)

也是你和dirkgently提到的例子.