zoukankan      html  css  js  c++  java
  • C/C++中容器vector用法

    C++中数组非常坑,有没有相似Python中list的数据类型呢?相似的就是vector!vector 是同一种类型的对象的集合,每一个对象都有一个对应的整数索引值。

    和 string 对象一样。标准库将负责管理与存储元素相关的内存。我们把 vector 称为容器,是由于它能够包括其它对象

    一个容器中的全部对象都必须是同一种类型的

    vector对象的定义和初始化

    相同的,使用前。导入头文件#include <vector> 能够使用using声明:using std::vector;
    vector 是一个类模板(class template)。使用模板能够编写一个类定义或函数定义,而用于多个不同的数据类型。因此,我们能够定义保存 string 对象的 vector,或保存 int 值的 vector,又或是保存自己定义的类类型对象(如 Sales_items 对象)的 vector。
    声明从类模板产生的某种类型的对象,须要提供附加信息,信息的种类取决于模板。以 vector 为例。必须说明 vector 保存何种对象的类型。通过将类型放在类型放在类模板名称后面的尖括号里来指定类型:

    vector<T> v1; 保存类型为 T 对象。默认构造函数 v1 为空。
    vector<T> v2(v1);  v2 是 v1 的一个副本。
    vector<T> v3(n, i); v3 包括 n 个值为 i 的元素。
    vector<T> v4(n);  v4 含有值初始化的元素的 n 个副本。
    【注意:1、若要创建非空的 vector 对象,必须给出初始化元素的值;2、当把一个 vector 对象拷贝到还有一个 vector 对象时。新复制的 vector 中每一个元素都初始化为原 vectors 中对应元素的副本。但这两个 vector 对象必须保存同一种元素类型;3、能够用元素个数和元素值对 vector 对象进行初始化。构造函数用元素个数来决定 vector 对象保存元素的
    个数,元素值指定每一个元素的初始值】

    vector对象动态增长

    vector 对象(以及其它标准库容器对象)的重要属性就在于能够在执行时高效地加入元素。

    【注意:由于 vector 增长的效率高,在元素值已知的情况下,最好是动态地加入元素。】

    值初始化:

    假设没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行,详细值为何。取决于存储在vector 中元素的数据类型。


    假设为int型数据,。那么标准库将用 0 值创建元素初始化式;
    假设 vector 保存的是含有构造函数的类类型(如 string)的元素,标准库将用该类型的默认构造函数创建元素初始化式;
    元素类型可能是未定义不论什么构造函数的类类型。这样的情况下。标准库仍产生一个带初始值的对象,这个对象的每一个成员进行了值初始化。
    /*
     * vector_test.cpp
     *
     *  Created on: 2014年6月24日
     *      Author: The_Third_Wave
     */
    #include <iostream>
    #include <string>
    #include <vector>
    using std::string; using std::vector; using std::cout; using std::endl;
    
    void pr_int_vector(vector<int> vec)
    {
        for(auto &v :  vec)
        {
        	cout<<v<<" ";
        }
        cout<<endl;
    }
    
    void pr_str_vector(vector<string> vec)
    {
        for(auto &v :  vec)
        {
        	cout<<v<<" ";
        }
        cout<<endl;
    }
    
    int main()
    {
    	vector<int> a;
    	vector<int> b(a);
    	vector<int> c(10, 23);
    	vector<string> s1(10, "null");
    	vector<string> s2(10);
        vector<string> s3 = {10, "hi!"}; // 重点关注
        vector<string> s4 = {"10", "hi!"}; // 重点关注
        pr_int_vector(a);
        pr_int_vector(b);
        pr_int_vector(c);
        pr_str_vector(s1);
        pr_str_vector(s2);
        pr_str_vector(s3);
        pr_str_vector(s4);
        return 0;
    }
    注意,没有=号!结果例如以下:
    23 23 23 23 23 23 23 23 23 23 
    null null null null null null null null null null 
              
    hi! hi! hi! hi! hi! hi! hi! hi! hi! hi! 
    10 hi! 

    【更新于2014.06.25】能够利用函数重载。仅仅有1个函数名(临时和Python还是有区别的,为什么不能仅仅定义一个函数呢?自己主动识别參数。兴许待求证)

    void pr_vector(const vector<int> &vec)
    {
    	// 由于是输出而不是改动。定义形參为常量引用,提高可靠性和效率!
        for(auto &v :  vec)
        {
        	cout<<v<<" ";
        }
        cout<<endl;
    }
    
    void pr_vector(const vector<string> &vec)
    {
    	// 由于是输出而不是改动,定义形參为常量引用。提高可靠性和效率!
        for(auto &v :  vec)
        {
        	cout<<v<<" ";
        }
        cout<<endl;
    }

    至于为什么range for 语句里使用的还是引用(&),保持好习惯!

    并且,这样的情况真的去改动值,会报错,由于是const & 类型,函数中不能改变实參!

    vector对象操作方法

    和string相似!

    v.empty() 

    Returns true if v is empty; otherwise returns false假设 v 为空,则返回 true,否则返回 false。

    v.size() 

    Returns number of elements in v返回 v 中元素的个数。
    【注意:1、返回对应 vector 类定义的size_type 的值。和string相似。

    2、使用 size_type 类型时,必须指出该类型是在哪里定义的。vector 类型总是包括总是
    包括 vector 的元素类型vector<int>::size_type

    v.push_back(t) 

    Adds element with value t to end of v在 v 的末尾添加一个值为 t 的元素。

    下面为样例:

    #include <iostream>
    #include <string>
    #include <cctype>
    #include <vector>
    
    int main()
    {
    	// read words from the standard input and store them as elements in a vector
    	std::string word;
    	std::vector<std::string> text; // empty vector
    	while (std::cin >> word) 
    	{
    		text.push_back(word); // append word to text
    		for(std::vector<int>::size_type ix =0; ix != text.size(); ++ix)
    		    std::cout<<"Now text["<<ix<< "]is: "<<text[ix]<<std::endl;
    	}
        return 0;
    }
    结果为:
    Hello
    Now text[0]is: Hello
    world!
    Now text[0]is: Hello
    Now text[1]is: world!
    注意:
    1、不能够直接输出vector对象!

    和Python区别太大了。。

    2、下标操作能够改变已有元素:比如上例。能够在最后加上:text[0] = "elements";
    3、当然和list一样,肯定不能text[100] = "elements";在Python中这样操作list会报下标越界,C++中编译不会报错。执行自己主动退出!【数组操作时这个会坑死你。不会报错,不会退出!

    理所当然,缓冲区溢出了,黑客们太喜欢了。

    4、由于动态增长。不能先測试长度,而是循环中动态測试!否则会出现莫名其妙的BUG!

    有人会操心效率?别操心!代价非常小【内联函数【更新于2014.06.25:内联函数,在函数返回类型前面用关键词inline定义----目的是把函数内联到主程序里面。相当于嵌入。作用就是省略了保存当前位置,调到函数位置执行再跳转的过程。】】。

    v[n] 

    Returns element at position n in v返回 v 中位置为 n 的元素。

    v1 = v2 

    Replaces elements in v1 by a copy of elements in v2把 v1 的元素替换为 v2 中元素的副本。

    v1 == v2 

    Returns true if v1 and v2 are equal假设 v1 与 v2 相等,则返回 true。

    !=, <, <=,>, and >=

    Have their normal meanings保持这些操作符惯有的含义。

    一个简单的样例

    读入一段文本到 vector 对象,每一个单词存储为 vector 中的一个元素。

    把vector 对象中每一个单词转化为大写字母。

    输出 vector 对象中转化后的元素,每八个单词为一行输出。

    假设文本为:in the vector. transform each word into uppercase letters. Print the transformed elements from the vector, printing eight words to a line.

    【2014.06.24备注:使用c++11新特性的改写样例在C/C++中字符串String及字符操作方法http://blog.csdn.net/zhanh1218/article/details/33306481)一文中

    #include <iostream>
    #include <string>
    #include <vector>
    
    std::string deal_word(std::string word)
    {
    	std::string WORD; // 创建空字符串
    	for(std::string::size_type ix =0; ix != word.size(); ++ix)
    	{
    		if (not ispunct(word[ix]))
    		{
    			WORD += toupper(word[ix]); //连接非标点字符到字符串
    		}
    	}
        return WORD;
    }
    
    int main()
    {
    	std::string word; // 缓存输入的单词
    	std::vector<std::string> text; // empty vector
    	std::cout<<"Please input the text:"<<std::endl; //提示输入
    	while (std::cin >> word and word != "INPUTOVER") // INPUTOVER 用于标示输入结束。也能够ctrl + z停止输入 
    	{
            word = deal_word(word); // 单词处理
    		text.push_back(word); // append word to text
    	}
    	for(std::vector<int>::size_type ix =0, j = 0; ix != text.size(); ++ix, ++j)
    	{
    		if (j==8) // 8个单词一行
    		{
    			std::cout<<std::endl; //换行
    			j = 0; //又一次计数
    		}
    	    std::cout<<text[ix]<<" "; //加空格!
    	}
        return 0;
    }
    结果为:
    Please input the text:
    in the vector. transform each word into uppercase letters. Print the transformed elements from the vector, printing eight words to a line. INPUTOVER
    IN THE VECTOR TRANSFORM EACH WORD INTO UPPERCASE 
    LETTERS PRINT THE TRANSFORMED ELEMENTS FROM THE VECTOR 
    PRINTING EIGHT WORDS TO A LINE 

    本文由@The_Third_Wave(Blog地址:http://blog.csdn.net/zhanh1218)原创。由于还有部分内容没有接触,仅仅讲了大概没有原因。会不定期更新,有错误请指正。

    假设你看到这篇博文时发现不完整。那是我为防止爬虫先公布一半的原因,请看原作者Blog。

    假设这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!假设您一定要转载。请带上后缀和本文地址。

  • 相关阅读:
    磁盘上没有足够的空间完成此操作的解决办法_Windows小知识
    使用XAMPP和DVWA在Windows7上搭建渗透测试环境
    使用WampServer和DVWA在Windows10上搭建渗透测试环境
    DOS系统常用命令
    Kali Linux图形界面与命令行界面的切换
    SQLMap入门之在Windows上安装SQLMap
    在Windows下同时安装Python2.x和Python3.x
    Python基础之Windows下Python3.x环境搭建
    在Linux上使用PGP签名验证文件完整性
    Ubuntu软件中心的完全启用
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10790653.html
Copyright © 2011-2022 走看看