您的位置:首页 > 编程语言 > C语言/C++

20170116C++阶段班04_STL_02vector

2017-01-17 14:33 429 查看

上节课回顾:

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交换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程