[英]C++ : iterating the vector
我是C ++的新手,正在尝试学习C ++中的向量。
我写了下面的小程序。 我喜欢像C#一样foreach(薪水不等),但是它不允许我这样做,所以我用Google搜索了它,发现我必须使用迭代器。输出。我得到的是“ 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9”,而不是“ 0 1 2 3 4 5 6 7 8 9”。
谁能解释一下为什么? 谢谢。
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
void show(int i)
{
cout << i << " ";
}
int main(){
vector<int> salaries(5);
for(int i=0; i < 10; i++){
salaries.push_back(i);
}
for_each(salaries.begin(), salaries.end(), show);
}
您创建了一个包含5个元素的向量,然后将10个元素推到最后。 这样一来,您总共可以获得15个元素,并且看到的是结果。 尝试更改向量的定义(尤其是构造函数调用),您将被设置。 怎么样:
vector<int> salaries;
这段代码创建一个大小为5的向量,并将这5个元素中的每个元素初始化为默认值(0):
vector<int> salaries(5);
push_back
插入一个新元素,因此,在此处插入10个新元素,最后以包含15个元素的向量结尾:
for(int i=0; i < 10; i++){
salaries.push_back(i);
}
您可以这样创建向量:
vector<int> salaries;
您将得到一个大小为0的向量。
另外,您可以使用大小10对其进行初始化,然后覆盖每个元素,而不是插入新元素:
vector<int> salaries(10);
for(int i=0; i < 10; i++){
salaries[i] = i;
}
在某些情况下,编写这样的内容可能会更有效:
vector<int> salaries; // create a vector with size 0
// allocate space for 10 entries, but while keeping a size of 0
salaries.reserve(10);
for(int i=0; i < 10; i++){
// because we reserved space earlier, these new insertions happen without
// having to copy the vector contents to a larger array.
salaries.push_back(i);
}
当声明salaries(5)时,它将向向量中添加5个条目,其值为0。然后,循环将添加0..9。 因此,向量中有15个元素,而不是10个。尝试声明不带5的向量。
vector<int> salaries;
vector<int> salaries(5);
就是说,您正在创建一个从头开始包含5个int
对象的向量,并且每个int
对象都使用默认构造函数初始化,并且在int
情况下,contructor设置了零值。 这就是为什么在向量容器的开头有5个零整数的原因。
@Michael:那是哪本书? 我会说这是错误的。 如果事先知道需要向量的大小,那么使用resize()是一个好习惯,但是除非在创建向量时需要包含默认初始化的值,否则不要在创建时设置大小。
您还可以提前在阵列中保留一些与重新调整大小完全不同的容量。 保留只是简单地“至少”为向量保留了这么多的容量(但不会更改向量的大小),而resize会向向量中添加\\ /删除向量中的元素,以使其达到请求的大小。
vector<int> salaries(5);
这将为其元素创建一个由5个零组成的向量。 [0,0,0,0,0]
for(int i=0; i < 10; i++){
salaries.push_back(i);
}
这会在0到9的末尾添加另外10个元素[0、0、0、0、0、0、1、2、3、4、5、6、7、8、9]
最后,我不建议过多使用foreach。 函数式编程的缺点是分散代码。 在某些情况下,它非常有用,但是对于这些情况,尤其是考虑到您的入门方式,我建议:
for (vector<int>::const_iterator it = salaries.begin(), end = salaries.end(); it != end; ++it){
salaries.push_back(i);
}
使用这种技术,您将能够遍历标准库中的任何集合,而不必为循环体编写单独的函数或函数对象。
使用C ++ 0x,您将获得很多好处,可以使此操作更容易:
for (int salary: salaries)
cout << salary << endl;
已经有了BOOST_FOR_EACH,如果您可以使用boost,它几乎一样容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.