C++:STL迭代

STL中的迭代是个重点,里面提供了大量的方法来方便我们程序猿开发,不过由于提供的太多导致学习比较吃力。这儿记录部分学习过程。
首先是C++11的for循环,比如对于一个vector v,可以通过for(int i : v)来实现迭代。如果对于自定义结构呢?也可以实现,如下代码示例调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
class Int_col {
public:
    Int_col () { for (int i = 0; i < 10; i++) data [i] = i; }
    int data [10];
    int* begin () { return &data [0]; }
    int* end () { return &data [10]; }
};
 
int main(int argc, char* argv[]) {
    Int_col v;
    for (int i : v) {
        cout << i << " ";
    }
 
    return 0;
}

这儿的结构中只有10个数据,在结构中提供begin与end方法的迭代器,即可实现C++11的for循环调用。结果如下所示:
20160502225605
继续阅读C++:STL迭代

C++11:变长模板的迭代与递归扩展

迭代的运行效率始终强于递归,递归始终比迭代方便开发。
变长模板属于C++11中比较复杂的技术,在此简单介绍下。在此贴出一个变长模板代码,为方便起见,参数类型全为int。如果需要不同的参数类型,只需要重载模板代码即可:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
template<class ... Args>
int Sum (Args... args) {
    return sizeof...(args);
}
 
int main (int argc, char* argv []) {
    cout < < Sum (1,2,23,124,4,23,43,24,32,4,23) << endl;
    return 0;
}

这是一个最简单的变长模板,首先是template定义,class后面加三个点就代表不固定长度。
接下来是Sum函数,在main函数的调用中实例化,被扩展为如下形式:

1
int Sum(int,int,int,int,int,int,int,int,int,int,int);

传了11个参数,就被实例化为11个参数形式。然后是sizeof...,这个宏是用来获取变长模板中元素的个数用的。我们调用时传了11个参数,它就返回11。程序运行的结果也相应为11。变长模板对于变长参数的优势之一为第一个参数不用定义参数个数(关于变长参数的访问详见深度研究C语言变长函数),但相应的劣势为无法直接访问参数。文章后面将简要介绍如何调用参数。
继续阅读C++11:变长模板的迭代与递归扩展