【c++】容器基础----顺序容器,vector,list,deque,forward

mac2022-06-30  275

线性容器包括vector,list,deque。++的优先级高于*应用 vector<int>::iterator iter = ivec.begin(); // prints 10 9 8 ... 1 while (iter != ivec.end()) cout << *iter++ << endl; // 返回加一前的副本,然后取值 如果使用++iter来进行输出,那么会漏掉第一个元素,打印出越界访问后的第一个元素。++a之后的结果可是左值,而a++之后的结果是右值只能出现在等号的右边。 //前置操作返回的是加1后的值,返回的是对象本身,所以这是左值。 //后置操作返回的是加1前的值,其返回值可以近似的理解为与原操作数值相等的 //量,所以是一个右值。 使用下标访问元素时记录元素下标的变量最好使用vector::size_type 类型,避免类型不同导致出错。示例如下: vector<int> vec{1,2,3}; for(vector<int>::size_type counter = 0;counter < vec.size();counter++) { cout<<vec[counter]<<endl; } vector中[]和at()的区别:编译运行下面一段代码就可以明白了: vector使用[]访问某一个元素或者对某一个元素进行赋值时不会报错,但是它是非法访问,vector的大小还是不变。const_iterator只能用来读取,而不能改变它的值,示例如下: vector<int> vec(10,33); for(vector<int>::const_iterator const_itr = vec.begin(); const_itr != vec.end(); const_itr++) { cout<<*const_itr<<endl; } 可以对vector的迭代器直接进行加减操作,it+10,it1-it2等的操作。push_back之后有可能会导致迭代器失效,所以插入之后要重新计算迭代器的值。但是下标访问仍然可以使用。不同的容器之间可以通过下面的方式进行转化,或者只取某一个容器中的部分元素。 vector<int> vec(10,33); list<int> lst(vec.begin(),vec.end() - 5); for(list<int>::iterator it = lst.begin(); it != lst.end(); ++it) { cout<<*it<<endl; } 使用一对指针去初始化容器: int myint[] = {1,2,3,4,5}; list<int> lst2(myint,myint+5); for(list<int>::iterator it = lst2.begin(); it != lst2.end(); ++it) { cout<<*it<<endl; } 某个类没有默认构造函数,但是他有一个带参数的构造函数,那么可以这么初始化 class MyClass{ private: int val; MyClass(){}; public: MyClass(int val){ cout<<"It me!\n"; } }; int main() { std::vector<MyClass> v(10,1); return 0; } 顺序容器中添加元素的操作 std::vector<int> v(20,0); list<int> lst(4,8); v.insert(v.begin() +2,3); cout<<v[2]<<" "<<v.size()<<endl;//输出3 21 v.insert(v.begin()+2,3,9); cout<<v[2]<<" "<<v[3]<<" "<<v[4]<<" "<<v.size()<<endl;//输出9 9 9 24 v.insert(v.begin()+2,lst.begin(),lst.end()); cout<<v[2]<<" "<<v[3]<<" "<<v[4]<<" "<<v[5]<<" "<<v.size()<<endl;//输出8 8 8 8 28 容器之间的比较 - 如果两个容器具有相同的长度而且所有元素都相等, 那么这两个容器就相 等;否则,它们就不相等。 - 如果两个容器的长度不相同, 但较短的容器中所有元素都等于较长容器中 对应的元素,则称较短的容器小于另一个容器。 - 如果两个容器都不是对文的初始子序列, 则它们的比较结果取决于所比较 的第一个不相等的元素。 resize()操作 访问容器内的元素; 上述四种方式,返回的都是应用,所以可以修改容器内元素的值。只有at才会检查是否越界。 注意区分begin和front,end和back,以及[]和at的区别。vrctor的8种创建方法 list<int> i_lst = {1,5,9}; std::vector<int> v(i_lst.begin(),i_lst.end()); std::vector<int> v2(v); std::vector<int> v3(10,2); std::vector<int> v4 = {1,2,3}; std::vector<int> v5(10); std::vector<int> v6; std::vector<int> v7{1,2,3}; std::vector<int> v8 = v;

emplace_back()和push_back()的区别在于,emplace_back中的参数可以是类的构造函数的参数,这样会调用构造函数直接产生一个对象放在容器中。如果使用push_backz这类的话,传入的参数只能是对象,而不能是构造函数的参数。范围删除,并不会删除e。vector和string不支持pop_front和push_front 如果有一个可以接受一个参数的构造函数,那么也可以在resize中传入第二个参数,来创建后面的元素。

最新回复(0)