Effective STL

【Effective STL(2)】vector和string

2018-03-02  本文已影响42人  downdemo

13 尽量使用vector和string来代替动态分配的数组

14 使用reserve来避免不必要的重新分配

size();
capacity();
resize(Container::size_type n);
reserve(Container::size_type n);
vector<int> v;
for (int i = 1; i <= 1000; ++i) v.push_back(i);
vector<int> v;
v.reserve(1000);
for (int i = 1; i <= 1000; ++i) v.push_back(i);
vector<int> v;
v.reserve(4);
v[0] = 2; // 下标溢出
v[3] = 1; // 下标溢出
vector<int> v(4); // v中包含4个0
v[0] = 2;
v[3] = 1;
string s;
...
if (s.size() < s.capacity()) {
    s.push_back('x'); // 不会使容器的迭代器失效
}

15 小心string实现的多样性

实现A 实现B 实现C 实现D

16 如何将vector和string的数据传给遗留的API

void f(const int* pInts, size_t numInts);
if (!v.empty()) {
    doSomething(&v[0], v.size());
}
void doSomething(const char *pString);
doSomething(s.c_str());
size_t fillArray(double *pArray, size_t arraySize);
vector<double> vd(maxNumDoubles);
vd.resize(fillArray(&vd[0], vd.size()));
size_t fillString(char *pArray, size_t arraySize);
vector<char> vc(maxNumChars);
size_t charsWritten = fillString(&vc[0], vc.size());
string s(vc.begin(), vc.begin()+charsWritten);
size_t fillArray(double *pArray, size_t arraySize);
vector<double> vd(maxNumDoubles);
vd.resize(fillArray(&vd[0], vd.size()));
deque<double> d(vd.begin(), vd.end());
list<double> l(vd.begin(), vd.end());
set<double> s(vd.begin(), vd.end());
void doSomething(const int* pints, size_t numInts);
set<int> intSet;
...
vector<int> v(intSet.begin(), intSet.end());
if (!v.empty()) doSomething(&v[0], v.size());

17 使用“交换技巧”来修整过剩容量

vector<Contestant>(contestants).swap(contestants);
string s;
... // 使s变大,然后删除所有字符
string(s).swap(s);
vector<Contestant> v;
string s;
... // 使用v和s
vector<Contestant>().swap(v); // 清除v并最小化容量
string().swap(s); // 清除s并最小化容量

18 避免使用vector<bool>

T *p = &c[0]; // 无论operator[]返回什么都可以用这个地址初始化一个T*
vector<bool> v;
bool *pb = &v[0]; // 用vector<bool>::operator[]返回值的的地址初始化一个bool*
template <typename Allocator>
vector<bool, Allocator> {
public:
    class reference {...}; // 用于产生引用独立比特的代理类
    reference operator[](size_type n); // operator[]返回一个代理
    ...
}
上一篇 下一篇

猜你喜欢

热点阅读