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)的元素,标准库将用该类型的默认构造函数创建元素初始化式;

元素类型可能是没有定义任何构造函数的类类型。这种情况下,标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始化。

#include <iostream>
#include <string>
#include <vector>

int main()
{
	std::vector<int> a;
	std::vector<int> b(a);
	std::vector<int> c(10, 23);
	std::vector<std::string> svec(10, "null");
	std::vector<std::string> svec2(10, "hi!");
	std::vector<std::string> svec3(10);
    return 0;
}

注意,没有=号!

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对象!和list差别太大了。。。

2、下标操作可以改变已有元素:例如上例,可以在最后加上:text[0] = "elements";

3、当然和list一样,肯定不能text[100] = "elements";在Python中这样操作list回报下标越界,C++中编译不会报错,运行自动退出!【数组操作时这个会坑死你,不会报错,不会退出!理所当然,缓冲区溢出了,黑客们太喜欢了!】

4、由于动态增长,不能先测试长度,而是循环中动态测试!否则会出现莫名其妙的BUG!有人会担心效率?别担心!代价很小【内联函数】。

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。

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

C/C++中容器vector使用方法,布布扣,bubuko.com

时间: 2024-10-14 23:49:34

C/C++中容器vector使用方法的相关文章

C/C++中容器vector使用方法&lt;第二弹&gt;

此文总结常用vector操作,是前一篇的续作!只有代码,详细请看代码中的注释.出于反爬虫的目的,你不是在http://blog.csdn.net/zhanh1218上看到的,肯定不是最新最全的. /********************************************************************* * file_name: vector_test.cpp * * Created on: 2014年6月28日 下午3:34:23 * Author: The_T

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的替换. 1.std::vector::erase() 函数原型:iterator erase (iterator position); //删除指定元素 iterator erase (iterator first, iterator last); //删除指定范围内的元素 返回值:指向删除元素(或

C++中容器vector的用法

参考C++ primer. vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和 string 对象一样,标准库负责管理存储元素的相关内存.我们把 vector 称为 容器 ,是因为它可以包含其他对象.一个容器中的所有对象都必须是同一种类型的.我们将在第 9 章更详细地介绍容器. 使用 vector 之前,必须包含相应的头文件.本书给出的例子,都是假设已作了相应的 using 声明: #include <vector> using std::vector; vector

备忘: C++中的 vector 容器

在C++ 中使用 vector:容器或叫向量.对用来管理不定长度的数据集或经常变化的数据组,很方便.可以简单的理解他是一种数据组,一种数据类型的集合. vector是同一种类型的对象的集合.它相当于一个动态的数组, 当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 使用vector首先要在程序开头处加上头文件,并使用其命名 : #include <vector> using std::vector; vector的声明与初始化: vector <类型

如何选择STL容器中对象的删除方法

备注:唯一从容器中除去一个元素的方法是在那个容器上调用一个成员函数. 以下介绍删除不同类型的容器中满足某种条件的值的方法,某种条件指的是 bool badValue(int value)返回true的情况. 1.序列容器 for(SeqContainer<int>::iterator i = c.begin(); i != c.end(); /*nothing*/) { if(badValue(*i)) { //something to do i = c.erase(i); } else ++

实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)

之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中,vector A中的结果我们可想而知,但是vector B中的元素还会如何? 看看之前写过的程序: #include <iostream> #include <vector> int main () { std::vector<int> myvector (3,100); std::vector<int>::iterator it; it = myvector

删除vector中元素高效的方法

#include <iostream> #include <vector> using namespace std; int main() { std::vector<int> ve1; ve1.push_back(1); ve1.push_back(2); ve1.push_back(3); ve1.push_back(4); ve1.push_back(5); ve1.push_back(6); std::vector<int>::iterator it

C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用

序列性容器::(vector和list和deque) erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被 删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式,但是erase的返回值为下一个有效的迭代器,所以   正确方法为:: for( iter = c.begin(); iter != c.end(); ) iter = c.erase(iter); 关联性容器::(map和set比较常用) erase迭代器只是被删元素的迭代器失效,但是返回值为void, 所

STL源码学习--vector使用方法总结

一.容器vector 使用vector必须包含头文件<vector>: #include<vector> 型别vector是一个定义于namespace std内的template: [cpp] view plaincopyprint? template<class _Ty, class _Ax = allocator<_Ty> > 第二个参数定义内存模型.我们一般采用默认的内存模型. 二.vector的功能 vector模塑出一个动态数组.vector将其