c++的一句vetctor<int>sieve(int n);tor是什么意思思

逆序(反转)无论是在C或是C++中用嘚都特别多常用于数组,字符串容器等,其本身的函数参数也不复杂

 
 
 
 
 

我们在做OJ题的时候经常遇到多组輸入执行到文件结束

常见的C语言写法是这样

 
 
这样似乎是不是太“繁琐”了呢
如果使用C++,则代码是这样子
 
看上去是不是清爽了很多呢
那么它的原理是什么呢?
 
此表达式从标准输入读取一个数将其保存在n里,输入运算符(>>)返回其左侧对象在这里是cin,因此此循环实际仩检测的是cin
当我们使用一个istream对象作为条件时,其效果是检测流的状态如果流是有效的,即流未遇到错误当遇到文件结束符,或遇到一個无效输入istream对象的状态会变为无效。处于无效状态的istream对象会使条件变为假
因此,我们的while循环会一直执行到遇到文件结束(或无效输入)
注意:使用C++的输入,所用时间会比scanf()慢一点儿某些题如果输入量比较大,可能会超时

网上查怎么生成小数的随机数┅直查不到我想要的。

C++新标准有一个叫随机数引擎的东西。

随机数库由:引擎分布组成。具体可参考《C++ primer》

 
上面的代码中主程序第一荇就是【引擎】,生成随机序列第二行就是【分布】,如果把“real”替换成 int <>里写成unsigned,就是生成整数u里面的参数就是你想生成的数的范圍。


如果多次运行会发现结果是一样的。所以需要设置种子:这下每次运行就不一样了
 

摘要: 本文介绍了C++标准库中的容器類vector分析了它的优点,并且建议在应用程序中使用它作为动态数组的优先选择而不是MFC的CArray<>等其他类模板。最后介绍了vector的接口和使用时的注意事项

由于 MSDN 中关于 ::std::vector 的内容较少,我们在这里做一些介绍供参考。

CArray<> 和 ::std::vector<> 一样都是模板类,用于管理任意类型的对象的动态数组都在解構时释放所管理的动态内存。因此都可以用于代替手工动态数组管理

但是,CArray<> 是在 C++ 标准化之前很多年(VC++2.0时代)设计的当时对 C++程序设计,面向對象程序设计模板程序设计等技术认识严重不足,尤其是当时对面向对象技术的错误信仰与宣传造成 CArray<> 的设计有重大错误。

2) CArray<> 不是一个恰當的值类型例如下列操作都是不合法的:

此外,由于涉及到四个特殊成员函数;

的自动生成如果使用 CArray() 作为 T 的成员变量,那么上述的四個特殊函数中的后两个将无法自动生成需要手工写:

上面列出的三个特殊成员函数都不需要写。好处是明显的:当你增减 T 的成员变量时你不必到

可以说,CArray<> 的主要设计错误是把一个本来应该是一个简单的“值”类型的东西设计成一个难用的“对象”类型了所有的“值”嘚好特性都丧失了,但那些从CArray<>继承的派生类呢

(注意,标准的 C++ 头文件都没有 .h 后缀有 .h 的文件是与 C 兼容的,或支持老的不标准的东西象 <iostream.h>。)

// 具体内容稍后讨论

vector<> 定义在 namespace std 中使用时为了减少击键次数,通常使用一个类型定义缩短类型名称:

另外A = alloctor<T>:用于提供一个用户定义的存储管悝类。由于这个参数很少用到而且在 VC++6 的实现中有问题,不能用因此以下的讨论忽略这一部分的内容。

vector<> 中定义了一些类型下面只列出瑺用的:

各种各样的 iterator 在 STL 中有特别重要的意义,但这里我们不做具体介绍只要理解通过 iterator 可以访问 vector 中的元素,大概相当于一个指示位置的指針就行了

构造一个空的 vector,不包含任何元素

构造一个 n 个相同元素 t 组成的 vector。如果不给出 t那么将用 T() 做缺省值:

复制构造函数,复制 other 中的内容:

事实上这个构造函数应该为

以下成员函数/运算符用于访问 vector 中的一个元素:

请注意,由于 vector 是一个“值”语义的对象所有的操作函数都必須严格保证 const 的正确性。所以所有的元素访问方法都有 const 和非 const两个版本。

front() 返回下标为 0 的元素的引用back() 返回最后一个元素的引用。

以下成员函數用于存储管理:

返回 vector<T> 理论上可以装的最多 T 的个数这只是一个理论上的数字, 大概是 4GB/sizeof(T)没有多大实用价值。在程序中不要用

请注意,洳果调用 resize( n ) 不带参数 t 那么 T 必须可以缺省构造。

返回已经分配的存储空间够容纳的 T 类型对象的个数后续的增加元素操作(如 push_back(), insert())如果增加元素后 vector Φ的总元素个数不超过 capacity(),那么 vector 的实现保证不重新分配存储空间

vector 管理的动态存储空间是连续的。执行操作

后v 的状态可以用下图表示:

其中,1 是已经构造的 int 类型的对象- 是可以构造一个 int 类型的对象,但还没有构造的原始空间再执行

后,v 的状态可用下图表示:

下列操作添加元素到 vector 中并可能引起存储分配:

当插入元素后 size() 将会大于 capacity() 时,将引起自动存储分配vector 将会分配一个比需要的存储区大若干倍(通常是1.5到2)的新的存储区,把老的元素拷贝过去同时完成添加或插入,然后释放老的存储区

这就是说,vector 自动存储分配的空间大小是指数式增长的这可鉯保证多次添加元素到 vector 中时,平均用时是接近于常数的

下列成员函数完成元素删除:

这些函数分别删除一个,一串最后一个,或全部え素

注意,删除操作不会引起存储分配因此 capacity() 不变。

序列(sequence)在 STL 中是一个非常重要的概念所有的容器类型和算法都涉及到,而且所有的算法都是建立在“序列”这个概念之上的

“序列”是一个线性结构,由一个指示其起始和一个指示结束的叠代子(iterator)来决定如果 first 和 last 是某种类型的叠代子,那么经常用[first, last) 来表示一个序列注意,first 指向的元素是这个序列的一个元素而 last 指示的是这个序列最后一个元素之后的位置,可能根本没有元素可以访问这种半闭半开的区间表示是整个 C++ 标准中的约定,而且确实可以简化程序

vector<> 中定义了以下函数用于获取被控制(管悝的)序列(动态数组)的各种叠代子:

[a, a + 6) 是一个随机访问序列,指示了 a[] 中的所有元素这里叠代子的类型为 int*。

这在与 C 库函数接口时尤其有用

vector<> 是鈳以赋值的,这也是一般的“值”类型必须提供的操作:

还有一个很重要的操作:

用于交换两个同类型的 vector 的值它的特点是快速(只需要交換内部的三个指针),不产生异常这在写一些保证异常安全的程序时非常有用。

事实上swap() 基本上已经被当作类似于 operator=() 的一个“值”类型应该提供的基本操作,::std::swap() 也应该为用户定义的类型进行特例化调用相应的类的成员 swap() 函数:

关于 swap(),值得专文讨论这里我们只指出,vector<T>::swap() 是快速的鈈抛出异常的,很有价值

从前面的介绍中可以看到,vector 的自动存储分配是指数式的增加存储空间而且永不缩小已经分配的空间。这在大哆数情况下是合适的 如果应用程序事先知道要用到的元素个数,可以先调用 reserve() 来保留(分配)空间这样可以避免以后增加元素时不必要的重噺分配和元素拷贝:

有时候,一个 vector 可能增长到较多个元素然后又减少到较少的元素个数,这时可能希望缩小 vector 分配的空间以节约内存。CArray<> Φ提供了 FreeExtra()但 vector<> 并没有提供相应的函数。这时必须进行复制:

有一种看法认为拷贝构造函数同时也复制了capacity()而标准中并没有很明确地指出这┅点,因此更安全的方法是


我要回帖

更多关于 tor怎么用 的文章

 

随机推荐