c++编程基础个人笔记(六)

1.string类

  • string类存取可以通过[ ]:方便、快捷;at()方法:执行边界检查,安全;
  • 具体用法详见C++primer或C++参考手册

2.智能指针模板

  • auto_ptr: 建立所有权,对于特定的对象只能有一个智能指针拥有它,赋值操作则会转让所有权,转让所有权后访问原对象会导致程序奔溃
  • unique_ptr:建立所有权,对于特定的对象只能有一个智能指针拥有它,赋值操作则会转让所有权,比auto_ptr更严格,转让所有权后访问原对象编译即报错
auto_ptr<string> films[5] = {
    auto_ptr<string> (new string("1111")),
    auto_ptr<string> (new string("1111")),
    auto_ptr<string> (new string("1111")),
    auto_ptr<string> (new string("1111")),
    auto_ptr<string> (new string("1111")),
};
auto_ptr<string> pwin;
pwin = films[2]; //转让所有权给pwin
*films[2]; // invalid, 程序崩溃,若使用unique_ptr则编译报错
  • share_ptr: 智能计数,当最后一个指针过期时,才调用delete,多个指向同一对象的指针时使用。

3.STL标准模板库--泛型编程

  • 关联容器中的元素按关键字来保存和访问的,而顺序容器中的元素则是按它们在容器中的位置来顺序保存和访问的;
  • 关联容器:有序集合---map:关键字-值对,set:关键字即值;multimap/multiset:关键字可重复存在

                         无序集合--unordered_map/unordered_set/unordered_multimap/unordered_multiset

// map 单词计数
// 关键字的类型是string,值的类型是int。进行下标操作是,我们使用string作为下标,得到与此string相关
//联的size_t类型的计数器。map是由pair对象组成的集合
map<string, size_t> word_count;
string word;
while(cin>> word)
    ++word_count[word];
// 可以通过word_count[...]访问,也可以通过迭代器解除引用成为pair对象访问
// map<string, size_t>::iterator iter = word_count.begin();
// iter->first指向键值,iter->second指向值


// set的使用--忽略某些单词
set<string> exclude={"The","But","and","a"};
string word;

while(cin>>word)
{
    if(exclude.find(word)==exclude.end())
        ++word_count[word];
}

 

  • 具体使用详见C++ primer或C++参考手册

4.函数对象

  • 函数对象即函数符,包含函数名、函数指针和重载了()运算符的类对象;
  • 预定义函数符:提供执行相加、相减等基本操作的函数基本函数符,使得将函数对象作为参数很方便;
#include <functional>
plus<double> add;
double y = add(2.2,3.4);
transform(gr8.begin(),gr8.end(), m8.begin(), plus<double>());//函数对象作为参数
  • 自适应函数符和函数适配器: 自适应二元函数对象可以将二元函数转换为一元函数。
//f2为自适应二元函数对象
binder1st(f2,val) f1; //f1(x)-->f2(val,x)
binder2st(f2,val) f1; //f1(x)-->f2(x,val)

5.输入、输出和文件:详见c++ primer

6.C++11新标准

  • 初始化列表:防止缩窄、提供模板类std::initializer_list;
char c2 = 273748273; //编译错误,防止缩窄

#include <initializer_list>
double sum(std::initializer<double> il);
int main() {
    double total = sum({2.5, 3.1, 4});
}
double sum(std::initializer<double> il) {
    double tot = 0;
    for(auto p = il.begin(); p != il.end(); p++) {
        tot += *p;
    }
    return tot;
}
  • auto:略;
  • decltype: 将变量类型声明为表达式指定的类型,用于模板比较方便;
template<typename T, typename U>
void ef(T t, U u) {
    decltype(T*U) tu;
    ...
}
  • 返回类型后置:在函数名和参数列表后面指定返回类型;
template<typename T, typename U>
auto eff(T t, U u) -> decltype(T*U) {
    ...
}
  • 模板别名: using =
using itType = std::vector<std::string>::iterator;
// 等同
typedef std::vector<std::string>::iterator itType;
  • 智能指针、右值引用(&&)、移动构造函数等:略;
  • lambda函数:可以访问作用域其他动态变量、方便查看函数定义;
//匿名函数
[](double x)->double{int y = x; return x-y;}
//指定名称
auto test = [](double x)->double{int y = x; return x-y;};
//传值和传引用
int Value = 0;
auto a1 = [](int x) {/*仅能访问全局外部变量*/};
auto a2 = [Value](int x) {/*值传递局部变量Value*/};
auto a3 = [this](int x) {/*值传递this指针*/};
auto a4 = [&Value](int x) {/*引用传递局部变量Value*/};
auto a5 = [=](int x) {/*值传递所有可访问的外部变量*/};
auto a6 = [&](int x) {/*引用传递所有可访问的外部变量*/};
auto a7 = [=, &Value](int x) {/*引用传递局部变量Value,值传递所有其他可访问的外部变量*/};
auto a8 = [&, Value](int x) {/*值传递局部变量Value,引用传递所有其他可访问的外部变量*/};
  • 包装器和可变参数模板等详见C++ primer
  • alignof返回类型要求的对齐方式,如:alignof(int);noexcept指出函数不会引发异常。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值