20170116C++阶段班04_STL_02vector
2017-01-17 14:33
316 查看
上节课回顾:
string里面就是调用basic_string里面的类容,string里面就是typedef。basic_string里面的charT实际上是一个泛型,他可能是char或者wchar,根据使用的string还是wstring的不同而不同。
c_str():返回的是以null结尾的C风格的字符串,data();返回纯所有的有效字符。
C++STL当中,不止有类提供的方法,还有提供一些其他的函数。
vector:
1:vector是C++里面非常好用的一个东西,是可变长数组。
2:C++里面有一些类称之为容器类,能存放一些东西的类称之为容器类,例如数组就是容器。数组特征是有顺序(下标)。成为有序容器(序列容器),vector也是序列容器,是有序的,vector就是一个可变长的数组。与有序容器相对应的是关联式容器。有序容器使用下标来进行索引,关联式容器是通过key和value来进行访问,key不一定是数值,而下标一定是数值。
3:C++里面序列式容器有vector,deque,list,关联式容器有set,map等。以后讲数据结构的时候再来细学。
4:vector可以完全的代替数组。可以构成随机存储。数组的随机访问速度是最快的,而vector继承了数组的这些特性。他是将数组进行了一层包装。使得数组的功能更加强大。
5:vector的使用。
#include <vector> #include <string> class Demo { public: private: }; int main() { using std::vector; using std::string; vector<int> demo;//int类型的vector。 vector<string> demostr;//string类的vector。 vector<Demo> demod;//自己写的类的vector。 vector<int*> demop;//指针的vector。 return 0; }
vector可以放任何类型。包括自己写的类、指针等都可以,引用不可以(无法直接初始化),const的不可以。
vector如果出错,报错个数可能会很多,错误可能比代码还多。这也是C++难的地方
6:构造函数:
部分来源于http://www.cplusplus.com/
default (1)
explicit vector (const allocator_type& alloc = allocator_type());
fill (2)
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
range (3)
template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
copy (4)
vector (const vector& x);
#include <iostream> #include <vector> #include <string> int main() { using std::vector; using std::string; using std::cout; using std::endl; vector<int> demo;//默认构造函数 vector<int> demo1(4, 100);//保存4个100 vector<int> demo2(demo1.begin()+1, demo1.end());//保存三个100 vector<int> demo3(demo2);//拷贝构造int i[] = { 2, 4, 6, 8, 10 }; vector<int> demo4(i, i + sizeof(i) / sizeof(int));//传入迭代器 vector<string> str(10, "I Love Mark!");//vector保存string示例 for (size_t i = 0; i < str.size(); ++i) cout << str.at(i) << endl; return 0; }
7:其他函数:
1:vector看起来像一个数组,但我们并不知道他的长度是多少,我们用push_back();来在结尾加值。尾部增加。
2:对应的pop_back();会将末尾的一个弹出。就是删掉最后一个元素,返回值为空。
3:back();函数可以获取最后一个元素,并不会弹出他。string和vector都有这个函数,并且都有const版本和非const版本。后者可以用来为最后一个元素赋值。
4:assign();赋值,将会替换整个容器(删去原来的部分)。
5:=号,直接交换,vector的交换,直接交换容器。如果用at();或者下标[]赋值,就是vector的元素的交换,调用的是对应类型的operator=。
#include <iostream> #include <vector> #include <string> int main() { using std::vector; using std::string; using std::cout; using std::endl; vector<string> demo(10, "I Love Mark"); vector<string> demo1(5, "So"); // demo = demo1;//调用的vector的operator= demo[0] = demo1[0];//string&(demo.op[](0)).op=( string&(demo1.op[0]) ) demo.at(0) = demo1.at(0);//string&(demo.at(0)).op=( demo1.at(0) );调用的是string的operator= demo.at(0) = "000";//string&(demo.at(0)).op=( string("000") ) cout << demo.size() << endl; for (size_t i = 0; i < demo.size(); i++) { cout << demo.at(i) << endl; } return 0; }
6:迭代器:
begin等函数返回的都是迭代器,可以返回vector里面所有的东西,是些抽象的东西,他的类型与vector定义的类型一样。他指的是容器当中的一个特定的位置。代表的并不是对象本身,迭代器相当于指向vector里面某个对象的对象,它本身也是对象,也可以认为他是一个完美的指针。
迭代器分为三种,正向迭代器,双向迭代器,随机访问迭代器。迭代器是支持操作的,vector是双向迭代器。
#include <iostream> #include <vector> #include <string> int main() { using std::vector; using std::string; using std::cout; using std::endl; vector<string> str(10, "66666"); vector<string>::iterator it = str.begin();//把迭代器取出来了。 //str.end();指的是最后一个元素的下一个位置,是不可访问的,否则会出错。 for (vector<string>::iterator it = str.begin(); it < str.end(); ++it) //for(auto it = str.begin(); it < str.end(); ++it);//与上面一样,自动推导类型,auto是C++11里面的东西。 cout << *it << endl; for (vector<string>::reverse_iterator it = str.rbegin(); it < str.rend(); ++it)//颠倒的iterator,他的++相当于原来iterator的-- cout << *it << endl; return 0; }
//不可以给it = str.end();时候的it赋值,it之间做比较的时候,可以认为就是比的指针地址。所有的begin和end都是这样的。
rbegin和rend返回是颠倒的迭代器(reverse_iterator)。两种iterator是不一样的。cbegin……返回的是const的。
7:size();代表的是数据长度,string类有length,vector是没有length属性的,length是字符串所特有的。
resize();重新分配长度。
8:insert();
传入参数是迭代器
single element (1)
iterator insert (iterator position, const value_type& val);
fill (2)
void insert (iterator position, size_type n, const value_type& val);
range (3)
template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);
插入的是一个元素(上面是string),插入位置是指定位置之前插入,例如:
#include <iostream> #include <vector> #include <string> int main() { using std::vector; using std::string; using std::cout; using std::endl; vector<string> str; str.push_back("1"); str.push_back("2"); str.push_back("3"); str.push_back("4"); str.push_back("5"); str.push_back("6"); str.push_back("7"); str.insert(str.begin() + 1, "11");//插入后str的内容为1,11,2,3…… str.insert(str.begin(), 2, "111");//插入后str的内容为111,111,1,11,2,3……是连续插入 for (vector<string>::iterator it = str.begin(); it < str.end(); ++it) cout << *it << endl; return 0; }
9:clear();清除所有元素和数据 10:erase();擦出,指定位置擦出,也可以制定区间擦出。
iterator erase (iterator position);
iterator erase (iterator first, iterator last);
11:swap();两个vector交换。
相关文章推荐
- 20170116C++阶段班04_STL_02vector
- 20170116C++阶段班04_STL_02vector
- 20170116C++阶段班04_STL_02vector
- 20170116C++阶段班04_STL_02vector
- 20170116C++阶段班04_STL_02vector
- 20170116C++阶段班04_STL_02vector
- 20170116C++阶段班04_STL_02vector
- 20170116C++阶段班04_STL_02vector
- 20170114C++阶段班04_STL_01string
- 20170119C++阶段班04_STL_04MyVector练习讲解
- 20170119C++阶段班04_STL_04MyVector练习讲解
- 20170118C++阶段班04_STL_03MyString练习讲解
- 20170114C++阶段班04_STL_01string
- 20170114C++阶段班04_STL_01string
- 20170118C++阶段班04_STL_03MyString练习讲解
- 20170118C++阶段班04_STL_03MyString练习讲解
- 20170119C++阶段班04_STL_04MyVector练习讲解
- 20170114C++阶段班04_STL_01string
- 20170118C++阶段班04_STL_03MyString练习讲解
- 20170118C++阶段班04_STL_03MyString练习讲解