C/C++中容器vector用法
C++中数组非常坑,有没有相似Python中list的数据类型呢?相似的就是vector!vector 是同一种类型的对象的集合,每一个对象都有一个对应的整数索引值。
和 string 对象一样。标准库将负责管理与存储元素相关的内存。我们把 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_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()
v.size()
2、使用 size_type 类型时,必须指出该类型是在哪里定义的。vector 类型总是包括总是
包括 vector 的元素类型vector<int>::size_type】
v.push_back(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!
注意:
和Python区别太大了。。
。
理所当然,缓冲区溢出了,黑客们太喜欢了。】
有人会操心效率?别操心!代价非常小【内联函数【更新于2014.06.25:内联函数,在函数返回类型前面用关键词inline定义----目的是把函数内联到主程序里面。相当于嵌入。作用就是省略了保存当前位置,调到函数位置执行再跳转的过程。】】。
v[n]
v1 = v2
v1 == v2
!=, <, <=,>, 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用法的更多相关文章
- C++中的vector 用法解析
一.概述 vector 是C++标准模板库的部分内容,他是一个多功能的,能够操作多种 数据结构和算法 的模板类和函数库. vector 是一个容器,它能够存放各种类型的对象, ...
- vector在C++中的基本用法
在写BlackJackGame的时候,考虑到要用到容器,所以就对容器的相关知识强化了一下: 因为我想的是有card类,最后要实现发牌,洗牌等等一系列的操作的时候,使用指向card类的对象的指针,将ca ...
- STL中的Vector相关用法
STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int> ...
- 【转】java.util.vector中的vector的详细用法
[转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...
- C++中vector用法
在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<in ...
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
序列性容器::(vector和list和deque) erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被 删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...
- #include <vector>用法之我见
vector是一种顺序容器,事实上和数组差不多,但它比数组更优越.一般来说数组不能动态拓展,(何为动态拓展,即是说如果你知道你要存的数据的个数,你定义的存储数据的数组大小也就决定了,但是若你事先不知道 ...
- STL vector用法介绍
STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...
- STL中mem_fun, mem_fun_ref用法
1.引言 先看一个STL中for_each的用法: #include <iostream> #include <vector> #include <algorithm&g ...
随机推荐
- LeetCode算法题-Jewels and Stones(Java实现)
这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...
- 通信(二):进程间通信之socket
一.为什么要学习socket? 我们打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?我们用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket.本地的进程间通 ...
- Storm入门(十三)Storm Trident 教程
转自:http://blog.csdn.net/derekjiang/article/details/9126185 英文原址:https://github.com/nathanmarz/storm/ ...
- mpvue小程序开发之 集成第三方UI框架Vant Weapp UI
集成进第三方的UI框架其实很简单 这里把vant-weapp的dist目录重命名为vant-weapp放在项目根目录的static文件夹下: 在src文件夹下,即我们写vue代码的位置,正在编写的页面 ...
- python进程和线程(六)
协程 协程,又称微线程,纤程.英文名Coroutine.顾名思义,协程是协作式的,也就是非抢占式的程序(线程是抢占式的).协程的关键字是yield,一看到这个就想到了生成器对不对?那就顺便回顾一下生成 ...
- go get golang.org被墙问题解决
go get golang.org被墙问题解决 今天在下载golang.org/x/image/tiff的时候出错 > go get -v golang.org/x/image/tiff Fet ...
- BeetleX之WebSocket详解
对于BeetleX来说编写WebSocket服务是一件非常简单的事情,当你实现一个Web Api应用的同时这些API方法也是WebSocket服务方法.接下来主要讲解如何通过JavaScript调用B ...
- 一套代码小程序&Web&Native运行的探索01
前言 前面我们对微信小程序进行了研究:[微信小程序项目实践总结]30分钟从陌生到熟悉 并且用小程序翻写了之前一个demo:[组件化开发]前端进阶篇之如何编写可维护可升级的代码 之前一直在跟业务方打交道 ...
- Spring Boot(六):如何优雅的使用 Mybatis
*:first-child{margin-top: 0 !important}.markdown-body>*:last-child{margin-bottom: 0 !important}.m ...
- NTP服务和DNS服务(week3_day3)--技术流ken
NTP时间服务器 作用:ntp主要是用于对计算机的时间同步管理操作. 时间是对服务器来说是很重要的,一般很多网站都需要读取服务器时间来记录相关信息,如果时间不准,则可能造成很大的影响. 部署安装NTP ...