使用vector的经验与总结
2010-10-17 22:23
260 查看
vector是一个类模板,也是一个容器类,即里面可以放一个个的元素,vector<T>容器中元素的类型就是T类型。vector有几个不同的构造函数:
1.默认构造函数 例如:vector<T>() ;// 构造了一个匿名的vector<T>的对象
2. 一个参数的构造函数 例如:vector<T>(10); // 构造了一个匿名的vector<T>的对象
注意该构造函数有一个默认参数,那就是最右边的参数。该构造函数的默认使用T类型的默认构造函数来初始化容器内的元素,即如果T类型没有默认构造函数,那么程序在编译时会报错。并且注意初始化的流程:首先调用T类的默认构造函数产生一个临时对象,在用这个临时对象作为参数,传递给拷贝构造函数。
上面的代码显示obj.size() = 10, obj.capacity() = 10,说明此时vector内的元素都已经被初始化过了,因为size==capacity,size指示vector内的已初始化或已装入的元素个数,capacity指示vector能容纳个元素个数。这时如果使用push_back()成员函数,是在obj后面添加新元素,这时obj.size()==11,obj.capacity()==20
上面的代码使用了reserve成员函数,此时obj.size() = 0,obj.capacity = 10,因为reserve函数只是在内存中申请了一片内存区域,并没有初始化。注意:因为内存区域没有初始化,所以不能引用vector中的元素,同理不能使用operator[].
3. 显式使用对象来初始化vector的元素。
同理 T类需要有相应的构造函数。
4. 使用迭代器来初始化vector<T>元素,这时迭代器指向的元素应该为T类型,或者如下情况:
即迭代器所指向的元素能够通过T类的相应构造函数转化为T类的对象,即每个迭代器(这里是指针)所指向的元素作为test(int)构造函数的参数,直接在vector申请的内存空间上初始化(不是先构造临时对象,再调用拷贝构造函数)。一个容易犯错误的例子:
5.我在平时编程中犯过的错误:
class test
{
public:
test()
:coll(10) // 在这里初始化
{
}
private:
vector<int> coll; // 这里不能写成vector<int>coll(10)
};
这里使用了一个composition,因为vector<int> 是一个类,所以在test类中使用了其他类,因此coll的构造应该在test类的初始化器中进行。
6.技巧:
使用vector构造二维数组:我在网上学的
vector的元素类型使vector<int>,在构造函数中第一个参数10表示外层vector的元素个数,即行数,第二个参数是用一个匿名的vector<int>对象初始化外层vector的每一个元素,这个匿名的vector有十个元素,每个元素都是int类型,所以这是个10*10的二维数组。外层vector的元素类型使vector<int>,所以使用coll[i]会得到一个vector<int>类型对象,使用copy算法和迭代器进行遍历。
1.默认构造函数 例如:vector<T>() ;// 构造了一个匿名的vector<T>的对象
2. 一个参数的构造函数 例如:vector<T>(10); // 构造了一个匿名的vector<T>的对象
注意该构造函数有一个默认参数,那就是最右边的参数。该构造函数的默认使用T类型的默认构造函数来初始化容器内的元素,即如果T类型没有默认构造函数,那么程序在编译时会报错。并且注意初始化的流程:首先调用T类的默认构造函数产生一个临时对象,在用这个临时对象作为参数,传递给拷贝构造函数。
#include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; int main() { vector<int> obj(10); //obj.push_back(5); cout << "obj.size() = " << obj.size() << endl; cout << "obj.capacity() =" << obj.capacity() << endl; copy(obj.begin(),obj.end(),ostream_iterator<int>(cout,"/n")); return 0; }
上面的代码显示obj.size() = 10, obj.capacity() = 10,说明此时vector内的元素都已经被初始化过了,因为size==capacity,size指示vector内的已初始化或已装入的元素个数,capacity指示vector能容纳个元素个数。这时如果使用push_back()成员函数,是在obj后面添加新元素,这时obj.size()==11,obj.capacity()==20
#include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; int main() { vector<int> obj; obj.reserve(10); cout << "obj.size() = " << obj.size() << endl; cout << "obj.capacity() =" << obj.capacity() << endl; return 0; }
上面的代码使用了reserve成员函数,此时obj.size() = 0,obj.capacity = 10,因为reserve函数只是在内存中申请了一片内存区域,并没有初始化。注意:因为内存区域没有初始化,所以不能引用vector中的元素,同理不能使用operator[].
3. 显式使用对象来初始化vector的元素。
]#include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; class A { public: A(int ii) {i = ii;} int i; }; int main() { A a(1); vector<A> obj(10,a); vector<A> obj1(10,A(1)); // obj1 and obj are equvalent cout << "obj.size() = " << obj.size() << endl; cout << "obj.capacity() =" << obj.capacity() << endl; return 0; }
同理 T类需要有相应的构造函数。
4. 使用迭代器来初始化vector<T>元素,这时迭代器指向的元素应该为T类型,或者如下情况:
]#include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; class test { public: test(int ii) { i = ii; } private: int i; }; int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,0}; vector<test> obj(arr,arr+10); cout << "obj.size() = " << obj.size() << endl; cout << "obj.capacity() =" << obj.capacity() << endl; return 0; }
即迭代器所指向的元素能够通过T类的相应构造函数转化为T类的对象,即每个迭代器(这里是指针)所指向的元素作为test(int)构造函数的参数,直接在vector申请的内存空间上初始化(不是先构造临时对象,再调用拷贝构造函数)。一个容易犯错误的例子:
5.我在平时编程中犯过的错误:
class test
{
public:
test()
:coll(10) // 在这里初始化
{
}
private:
vector<int> coll; // 这里不能写成vector<int>coll(10)
};
这里使用了一个composition,因为vector<int> 是一个类,所以在test类中使用了其他类,因此coll的构造应该在test类的初始化器中进行。
6.技巧:
使用vector构造二维数组:我在网上学的
#include <iostream> #include <vector> #include <iterator> #include <algorithm> using namespace std; int main() { vector<vector<int> > coll(10,vector<int>(10)); for(int i=0; i<coll.size();++i) { copy(coll[i].begin(),coll[i].end(),ostream_iterator<int>(cout," ")); cout << endl; } return 0; }
vector的元素类型使vector<int>,在构造函数中第一个参数10表示外层vector的元素个数,即行数,第二个参数是用一个匿名的vector<int>对象初始化外层vector的每一个元素,这个匿名的vector有十个元素,每个元素都是int类型,所以这是个10*10的二维数组。外层vector的元素类型使vector<int>,所以使用coll[i]会得到一个vector<int>类型对象,使用copy算法和迭代器进行遍历。
相关文章推荐
- 使用vector的经验与总结
- [水晶报表]水晶报表的使用经验和资料总结
- log4net使用经验总结
- JTree用法及JTree使用经验总结(转)
- UML使用经验及总结
- 使用node.js半年来总结的经验
- DevExpress控件使用经验总结
- Less 使用 经验总结
- 基于Metronic的Bootstrap开发框架经验总结(3)--下拉列表Select2插件的使用
- MyEclipse使用经验总结
- Elasticsearch的使用经验总结
- MyEclipse使用经验总结
- VC/MFC之ListCtrl控件使用经验总结(转)
- linux socket使用经验总结
- 【STL】根据一段代码总结STL中vector的一些使用方法
- 转贴:Chart Control 使用经验总结
- 总结使用Unity 3D优化游戏运行性能的经验
- Linux环境SVN命令行使用经验总结
- PHP-resque使用经验总结