stl学习记录(2)

#include <iostream>
#include <utility>
#include <tuple>
#include <complex>
#include <string>

using namespace std;

// 代码 改编自 C++标准库——自学教程与参考手册  英文第二版

//====================================
// tuple io
template <int IDX,int MAX,typename... Args>
struct PRINT_TUPLE{
    static void print(ostream& strm, const tuple<Args...>& t){
        strm << get<IDX>(t) << (IDX + 1 == MAX ? "" : ",");
        PRINT_TUPLE<IDX + 1, MAX, Args...>::print(strm,t);
    }
};

template <int MAX,typename... Args>
struct PRINT_TUPLE<MAX, MAX, Args...>{
    static void print(ostream& strm, const tuple<Args...>& t){
    }
};

template <typename... Args>
ostream& operator << (ostream& strm,
    tuple<Args...>& t)
{
    strm << "[";
    PRINT_TUPLE<0, sizeof...(Args), Args...>::print(strm,t);
    return strm << "]";
}

//====================================

class Foo{
public:
    Foo(tuple<int, float>){
        cout << "Foo::Foo(tuple)" << endl;
    }

    template <typename... Args>
    Foo(Args... args){
        cout << "Foo::Foo(atgs...)" << endl;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    // cpp11 后 一些新语法 在STL中得使用
    tuple<int, double>t(1,2.22);

    pair<int, Foo>p1(42, t);

    pair<int, Foo>p2(piecewise_construct, make_tuple(42), t);

    // 使用 ref() 表示对变量的引用
    int i = 0;
    auto p = make_pair(ref(i), ref(i)); // 创建 pair<int&,int&>
    ++p.first;
    ++p.second;
    cout << "i = " << i << endl;

    // tie() 演示
    pair<char, char> q = make_pair(‘c‘,‘b‘);
    char c;
    tie(ignore, c) = q; // char c == ‘b‘

    //
    tuple<string, int, int, complex<double>> tt;
    tuple<int, double,string> t1(41,6.3,"nico");

    cout << get<0>(t1) << " ";
    cout << get<1>(t1) << " ";
    cout << get<2>(t1) << " ";
    cout << endl;

    auto t2 = make_tuple(22,44,"nico");
    get<1>(t1) = get<1>(t2);
    t1 = t2;

    // tuple io
    tuple <int, double, string> iot(77, 1.1, "more light");
    cout << "io: " << iot << endl;

    return 0;
}

cpp11stl的例子 VS2013下编译 通过

时间: 2024-11-05 15:49:24

stl学习记录(2)的相关文章

stl学习记录

Effective STL 中文版学习记录 条款4 判断容器是否为空 使用empty而不是size().size()操作在实现上不是一个时间常数操作条款5 尽量使用区间成员函数代替它们的单元素兄弟.STL实现中,区间范围显示比单个循环操作更优化 条款7:当使用new得指针的容器时,记得在销毁容器前delete那些指针vc2008下 运行代码 可以看到 该程序内存不断增加// 1111111.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" #incl

STL学习记录:链表

直接百度链表的话,其实和真正用起来的STL链表差的挺远的(毕竟有些情况能用就行~),还是自己写一下记录一下STL里链表具体用法吧 #include <bits/stdc++.h> using namespace std; int main () { //1. 定义 //list<数据类型> 链表名称 list<int> test; list<int>::iterator iter=test.begin(); //2. 增删改查 //增加 test.push_

c++ STL 学习记录 草稿。

非常丑陋的尝试实现stl.慢慢修改吧. 1)简单实现 vector和list. 2)思索如何开始编写算法. 1,所有容器继承一个抽象容器.那么算法就可以使用抽象基类的next方法来遍历元素. 容器间耦合太高,放弃. 2,所有容器的元素T继承一个基类,算法使用基类的next方法来遍历元素.应该是可以的.做到一半,实现多态时,必须太多指针样子,好像跟stl的使用相差太远.看书发现stl是用模板模拟多态.或者说是模板的正宗,优雅的多态形式. 3,使用模板的更优雅的多态思想来实现容器的迭代器. 3)后面

STL学习记录:栈与队列

首先是栈的基本操作,也就这些了 #include <bits/stdc++.h> using namespace std; int main () { stack<int> test;//声明方式:stack <数据类型> 名称 test.push(2); //向栈中压入2 test.top()=1; //也可以直接改变栈顶的值 test.pop(); //弹出栈顶部的值 if (test.empty())//如果栈空,返回true cout<<"

STL学习之路之仿函数

STL中的仿函数(或者叫做函数对象):可以实现类似于函数一样的类型,函数最直接的调用形式就是:返回值 函数名(参数列表),仿函数实现了operator()操作符,使用类似于函数. 同时,STL还为仿函数提供了强大的配接器,也就是适配器Adapters,这些适配器本身也属于仿函数,调用方式同样类似于函数.更进一步,这些适配器可以和仿函数.函数.适配器再进行绑定.组合.适配,完成更加复杂的功能. 这部分应该是STL中最简单的部分,实现也比较简单.另外C++11标准对这部分调整比较大,我们先不考虑.暂

STL学习_配接器篇

STL学习_配接器篇 定义 配接器(Adapter)在STL组件的灵活组合运用功能上,扮演着轴承.转换器的角色.它事实上是一种设计模式.即将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作. 分类 STL所提供的各种适配器中,改变仿函数(functors)接口者,称为function adapter:改变容器(containers)接口者,称为container adapter:改变迭代器(iterators)接口者,称为iterato

【程序员编程艺术】学习记录2:左旋转字符串之循环移位法

[程序员编程艺术]学习记录2:左旋转字符串之循环移位法 GCD算法:(辗转相除法/欧几里得算法) gcd是求最大公约数的算法,作为TAOCP第一个算法 gcd算法流程: 首先给定两个整数m,n(m大于等于n)如果小于则直接交换再处理 ①求余数 r=m%n ②假如r=0,算法结束,n即为所求 否则,重新令m <- n, n <-r 之后循环 <<<<<<<<<<<<<<<<<<<&l

Python学习记录-2016-12-17

今日学习记录 模块: import os#导入os模块 import sys#导入sys模块 os.system("df -h")#执行df -h命令 cmd_res = os.popen("df -h").read()#将命令的返回结果赋值给cmd_res,如果不加入.read()会显示命令的返回加过在内存的位置 print(sys.path)#显示系统变量路径,一般个人模块位于site-packages下,系统模块位于lib下 print(sys.argu[2]

Objc基础学习记录5

NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendingFormat:可以添加多个类型的字符串. int,chat float,double等 3.stringWithString 创建字符串, 4.rangeOfString 返回str1在另一个字符串中的位置. 5.NSMakeRange(0,3) 字符串0位到3位. 6.deleteCharac