Effective STL

【Effective STL(7)】使用STL编程

2018-03-16  本文已影响32人  downdemo

43 尽量用算法调用代替手写循环

44 尽量用成员函数代替同名的算法

set<int> s; // 建立set,放入1,000,000个数据
...
set<int>::iterator i = s.find(727); // 使用find成员函数
if (i != s.end()) ...
set<int>::iterator i = find(s.begin(), s.end(), 727); // 使用find算法
if (i != s.end()) ...

45 注意count、find、binary_search、lower_bound、upper_bound和equal_range的区别

list<Widget> lw; // Widget的list
Widget w;
if (count(lw.begin(), lw.end(), w) != 0) ...
if (find(lw.begin(), lw.end(), w) != lw.end()) ... // 找到了
vector<Widget>::iterator i = lower_bound(vw.begin(), vw.end(), w);
if (i != vw.end() && *i == w) ...
vector<Widget> vw;
...
sort(vw.begin(), vw.end());
typedef vector<Widget>::iterator VWIter;
typedef pair<VWIter, VWIter> VWIterPair;
VWIterPair p = equal_range(vw.begin(), vw.end(), w);
if (p.first != p.second) ... // 找到了
VWIterPair p = equal_range(vw.begin(), vw.end(), w);
cout << "There are " << distance(p.first, p.second)
<< " elements in vw equivalent to w.";
class Timestamp { ... };
bool operator<(const Timestamp& lhs, const Timestamp& rhs);
vector<Timestamp> vt;
...
sort(vt.begin(), vt.end());
Timestamp ageLimit;
...
vt.erase(vt.begin(), lower_bound(vt.begin(), vt.end(), ageLimit));
vt.erase(vt.begin(), upper_bound(vt.begin(), vt.end(), ageLimit));
class Person {
public:
    ...
    const string& name() const;
    ...
};

struct PersonNameLess : public binary_function<Person, Person, bool> {
    bool operator()(const Person& lhs, const Person& rhs) const
    {
        return lhs.name() < rhs.name();
    }
};

list<Person> lp;
...
lp.sort(PersonNameLess());
Person newPerson;
...
lp.insert(upper_bound(lp.begin(), lp.end(), newPerson, PersonNameLess()), newPerson);
set<Widget> s;
...
Widget w;
...
if (s.count(w)) ... // 找到了
目标 无序区间算法 有序区间算法 set或map的成员函数 multiset或multimap的成员函数
值是否存在 find binary_search count find
值是否存在,第一个等于这个值的对象在哪里 find equal_range find find或lower_bound
第一个不在期望值之前的对象在哪里 find_if lower_bound lower_bound lower_bound
第一个在期望值之后的对象在哪里 find_if upper_bound upper_bound upper_bound
有多少对象等于期望值 count equal_range再distance count count count
等于期望值的所有对象在哪里 find(迭代) equal_range equal_range equal_range

46 考虑使用函数对象代替函数作算法的参数

vector<double> v;
...
sort(v.begin(), v.end(), greater<double>());
inline
bool doubleGreater(double d1, double d2)
{
    return dl > d2;
}
...
sort(v.begin(), v.end(), doubleGreater);
void sort(vector<double>::iterator first,
    vector<double>::iterator last, 
    bool (*comp)(double, double));
// 返回两个浮点数的平均值
template<typename FPType>
FPTypeaverage(FPType val1, FPType val2)
{
    return (val1 + val2) / 2;
}
// 把两个序列的成对的平均值写入一个流
template<typename InputIter1, typename InputIter2>
void writeAverages(InputIter1 begin1, InputIter1 end1, InputIter2 begin2, ostream& s)
{
    transform(begin1, end1, begin2,
        ostream_iterator<typename iterator_traits
            <lnputIter1>::value_type> (s, "\n"),
        average<typename iteraror_traits
            <InputIter1>::value_type>
    );
}
template<typename FPType>
struct Average : public binary_function<FPType, FPType, FPType> {
FPType operator()(FPType val1. FPType val2) const
{
    return average(val 1 , val2);
}
template<typename InputIter1, typename InputIter2>
void writeAverages(lnputIter1 begin1, InputIter1 end1,
    InputIter2 begin2, ostream& s)
{
    transform(begin1, end1, begin2,
        ostream_iterator<typename iterator_traits
            <lnputIter1>::value_type>(s, "\n"),
        Average<typename iterator_traits
            <InputIter1>::value_type>());
}

47 避免产生只写代码

v.erase(remove_if(find_if(v.rbegin(), v.rend(), bind2nd(greater_equal<int>(), y)).base(),
    v.end(),
    bind2nd(less<int>(), x)),
    v.end());
typedef vector<int>::iterator VecIntIter;
VecIntIter rangeBegin = find_if(v.rbegin(), v.rend(),
    bind2nd(greater_equal<int>(), y)).base();
v.erase(remove_if(rangeBegin, v.end(), bind2nd(less<int>(), x)), v.end());

48 总是#include适当的头文件

49 学习破解有关STL的编译器诊断信息

vector<int> v(10);
string s(10);
basic_string<char, char_traits<char>, allocator<char>>
std::basic_string<char, std::char_traits<char>, std::allocator<char>>

50 让你自己熟悉有关STL的网站

上一篇 下一篇

猜你喜欢

热点阅读