我已经用C ++编程了很长一段时间了,但我偶尔会偶然发现一个使用STL的代码片段,这会花费我很多时间和更多的代码来完成。
STL需要相当长的一段时间才能习惯,并且没有很多资源可以使用真实的例子来说明如何使用它。请与我分享您最喜爱的STL功能!
答案 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_sum
和inner_product
应该得到比他们看到的更多的爱。凭借足够聪明的仿函数,他们可以做很多事情。
答案 7 :(得分:3)
我最喜欢的STL技巧是避免使用
STL代码与蛮力等效的表现力令人惊叹。
答案 8 :(得分:2)
容器,迭代器,算法:所有好东西。而且这本身并不是一个绝招,但对我而言,关于STL的最好的事情是functors。迭代器可能是将STL汽车固定在一起的粘合剂,但是仿函数是使真正节省时间并编写更好代码的引擎。毕竟,这就是STL的意义所在。