你最喜欢的STL技巧是什么?

时间:2010-11-18 21:30:51

标签: c++ stl

我已经用C ++编程了很长一段时间了,但我偶尔会偶然发现一个使用STL的代码片段,这会花费我很多时间和更多的代码来完成。

STL需要相当长的一段时间才能习惯,并且没有很多资源可以使用真实的例子来说明如何使用它。请与我分享您最喜爱的STL功能!

9 个答案:

答案 0 :(得分:15)

使用erase-remove-idiom从线性时间中的矢量中删除某些元素:

vec.erase(std::remove(vec.begin(), vec.end(), is_odd), vec.end());

(手动循环向量并在每个元素的基础上进行擦除将是二次时间。)

答案 1 :(得分:11)

dos2unix.cpp

#include <fstream>
#include <iterator>
#include <algorithm>

bool is_cr(char c) { return c == '\r'; }

int main(int, char* a[])
{
    std::ifstream is("/dev/stdin");
    std::ofstream os("/dev/stdout");
    std::istreambuf_iterator<char> in(is), end;
    std::ostreambuf_iterator<char> out(os);
    remove_copy_if(in, end, out, is_cr);
}

答案 2 :(得分:8)

我记得在comp.lang.c++.moderated偶然发现它(〜10年前)时我非常喜欢的一个:

int main(int argc, char* argv[])
{
  std::vector arguments(argv+1, argv+argc);
  // whatever
}

今天,我不再使用它了。为什么要将这些东西放入一个向量中,然后由迭代器处理,当你已经有迭代器开始时?这与STL作为容器和算法集合的关系并不多,但更多的是它给我们带来了迭代器粘合序列和算法的想法:

template<typename It>
int process_arguments(It begin, It end)
{
  // whatever we need to do with those arguments... 
}

int main(int argc, char* argv[])
{
  return process_arguments(argv+1, argv+argc);
}

(是的,我经常写小型控制台实用程序。)

答案 3 :(得分:7)

使用矢量作为缓冲区。而不是:

int size_needed = GetData(NULL, 0);
char * buffer = new char[size_needed];
GetData(buffer, size_needed);
...
delete [] buffer;

使用矢量:

int size_needed = GetData(NULL, 0);
std::vector<char> buffer(size_needed);
GetData(&buffer[0], size_needed);

答案 4 :(得分:4)

shared_ptr中的shared_ptr。

我有时会使用std :: shared_ptr自定义析构函数来实现一个简单的池化工厂方法。 Dunno,如果它算作“技巧”。

class Factory
{
    std::queue<std::shared_ptr<Type>> pool_; // Possibly tbb::concurrent_bounded_queue. Could also be contained as a shared_ptr to allow objects to outlive the factory.
public:
    std::shared_ptr<Type> create()
    {
        std::vector<Type> ptr;
        if(pool.empty())
            ptr = std::make_shared<Type>();
        else
        {
            ptr = std::move(pool_.front());
            pool_.pop();
        }

         return std::shared_ptr<Type>(ptr.get(), [=](Type*){pool_.push(ptr)};); // Put back into pool once destructed
     }
 }

答案 5 :(得分:4)

我最喜欢的是使用STL进行功能式编码。例如,计算小于2的元素:

n = std::count_if(v.begin(), v.end(), std::bind2nd(std::less<int>(), 2));

答案 6 :(得分:3)

不是特别有用,但是我喜欢假装std::iota(其中C ++ 0x不可用)并调用std::partial_sum

    std::vector<int> v(5, 1); // 1, 1, 1, 1, 1
    partial_sum(v.begin(), v.end(), v.begin()); // 1, 2, 3, 4, 5

至于我在生产代码中实际使用过的东西:测试两个文件是否相同:

    if(equal(std::istreambuf_iterator<char>(file1),
             std::istreambuf_iterator<char>(),
             std::istreambuf_iterator<char>(file2)))
    { // files are equal, do whatever

一般来说,我认为partial_suminner_product应该得到比他们看到的更多的爱。凭借足够聪明的仿函数,他们可以做很多事情。

答案 7 :(得分:3)

我最喜欢的STL技巧是避免使用

  • CRT
  • 原始指针(C ++ 0x)。

STL代码与蛮力等效的表现力令人惊叹。

答案 8 :(得分:2)

容器,迭代器,算法:所有好东西。而且这本身并不是一个绝招,但对我而言,关于STL的最好的事情是functors。迭代器可能是将STL汽车固定在一起的粘合剂,但是仿函数是使真正节省时间并编写更好代码的引擎。毕竟,这就是STL的意义所在。