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。

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

C/C++中容器vector用法的更多相关文章

  1. C++中的vector 用法解析

         一.概述     vector 是C++标准模板库的部分内容,他是一个多功能的,能够操作多种 数据结构和算法 的模板类和函数库.     vector 是一个容器,它能够存放各种类型的对象, ...

  2. vector在C++中的基本用法

    在写BlackJackGame的时候,考虑到要用到容器,所以就对容器的相关知识强化了一下: 因为我想的是有card类,最后要实现发牌,洗牌等等一系列的操作的时候,使用指向card类的对象的指针,将ca ...

  3. STL中的Vector相关用法

    STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int> ...

  4. 【转】java.util.vector中的vector的详细用法

    [转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...

  5. C++中vector用法

    在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<in ...

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

    序列性容器::(vector和list和deque)   erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被   删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...

  7. #include <vector>用法之我见

    vector是一种顺序容器,事实上和数组差不多,但它比数组更优越.一般来说数组不能动态拓展,(何为动态拓展,即是说如果你知道你要存的数据的个数,你定义的存储数据的数组大小也就决定了,但是若你事先不知道 ...

  8. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  9. STL中mem_fun, mem_fun_ref用法

    1.引言 先看一个STL中for_each的用法: #include <iostream> #include <vector> #include <algorithm&g ...

随机推荐

  1. 常见的磁盘I/O和网络I/O优化技巧

    磁盘I/O 优化 性能检测 应用程序通过访问磁盘来读取数据,而磁盘I/O 通常都是很耗时间的,所以一般我们来判断I/O是否有瓶颈的时候,就需要一些参数指标来参考. WAIT 指标 :压测应用程序,查看 ...

  2. 网络I/O 工作机制

    数据从一台主机发送到网络中的另一台主机需要经过很多步骤,先得有相互沟通的意向,然后得有物理渠道(物理链路),其次双方还得有语言能够交流,且步调要一致. TCP状态转化 如图,是TCP/IP 的握手过程 ...

  3. LeetCode算法题-Jewels and Stones(Java实现)

    这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...

  4. Linux集群时间同步方法

    方法1.ntp  平滑同步时间 (一)确认ntp的安装 1)确认是否已安装ntp [命令] rpm –qa | grep ntp 若只有ntpdate而未见ntp,则需删除原有ntpdate.如: n ...

  5. shell读取文件内容并进行变量赋值

    需求: shell读取文件内容,然后把内容赋值给变量然后进行字符串处理 实现: dataline=$(cat /root/data/data.txt) echo $dataline

  6. ASP.NET Aries 高级开发教程:Excel导入配置之规则说明(下)

    前言: 前面两篇都是大体介绍流程,有一些配置细节,没有细说,这里用一篇补上. 1.Excel配置项 起始行索引.列头跨行数: 对于自定义的Excel导入模板(有时候模板是由客户提供,模板的规则很乱) ...

  7. SUSE12SP3-Zookeeper安装

    直接使用root账号 1.zookeeper安装 将zookeeper-3.4.13.tar.gz安装包放置指定目录 sudo tar -zxvf zookeeper-3.4.13.tar.gz -C ...

  8. pycharm远程同步服务器代码,并设置权限

    Pycharm开发工具链接至上面创建的虚拟环境链接 权限问题:此时上传还可能遇到权限问题,即使用的用户名没有权限在给定的目录下写入和修改文件. ubuntu权限管理:移动到指定目标上传文件夹的父文件夹 ...

  9. shell打印 倒等腰三角形

    #!/bin/bash read -p "input the length: " n方法一:内循环中的一个for循环shell写法for i in `seq 1 $n`do    ...

  10. mac电脑 上强大的RAW图像处理工具 ——RAW Power

    苹果电脑曾经有一款名为Aperture的照片处理应用,最终因为苹果软件策略的更好与升级,这款应用已经被苹果砍掉.但Aperture的开发者们并未放弃这款应用,在Mac OS上推出了一款名为RAW Po ...