2010-06-26 125 views
1

我对C++非常陌生,我试图在C++中学习矢量..C++:遍历矢量

我写了如下的小程序。我喜欢的foreach如C#(在工资VAR SAL),但它不允许我这样做,所以我用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); 
} 

回答

9

您创建了一个矢量具有5个元素,则10个推到终点。这给你总共15个元素,以及你看到的结果。试着改变你的向量的定义(尤其是构造函数调用),你会被设定。如何:

vector<int> salaries; 
+0

嗯...只是打败了我。 – nathan 2010-06-26 15:12:46

+0

很好..谢谢。我会将其标记为已回答。 – 2010-06-26 15:15:32

+0

但需要等待7分钟。再次感谢.. – 2010-06-26 15:15:55

2

当您声明工资(5)时,它将5个条目添加到值为0的向量中,然后您的循环将添加0..9。因此,你有你的矢量的15个元素,而不仅仅是10.尝试宣告矢量而不5.

vector<int> salaries; 
+0

谢谢。我想将您的帖子标记为回复帖子,但我只能选择一个..谢谢。 – 2010-06-26 15:18:19

+0

没问题迈克尔,我只需要学习更快:) – nathan 2010-06-26 15:27:50

3

此代码创建大小为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); 
} 
+0

我认为你是'resize'和'reserve'混淆。你使用'resize'的例子创建了20个元素 - 'resize'分配空间_and_创建元素。 'reserve'只是分配空间。 http://www.cplusplus.com/reference/stl/vector/resize/ – Stephen 2010-06-26 15:29:19

+0

@Stephen:呃,你当然是对的。不知道我在想什么......我甚至在评论中写了保留,但仍称为“调整大小”。现在修复,谢谢指出。 :) – jalf 2010-06-26 17:14:37

0

vector<int> salaries(5);手段,正在创建包含从一开始5个int对象,每个对象int与默认的构造初始化,并且在int构造器的情况下,设置的零值的向量。这就是为什么在矢量容器的开始处有5个零整数。

0

@迈克尔:这本书是什么?我想说 这是错的。如果事先知道 需要的矢量大小,则使用resize()是一个很好的练习 ,但除非 需要矢量包含 默认初始化值,否则 不会在创建时设置大小。

您也可以reserve阵列中的某些容量提前,这是小于不同于重新大小。只保留“至少”该向量的容量(但不会更改向量的大小),而调整大小会将\从元素中移除\以使其成为请求的大小。

0
vector<int> salaries(5); 

这将为其元素创建一个5个向量的向量。 [0,0,0,0,0]

for(int i=0; i < 10; i++){ 
    salaries.push_back(i); 
} 

这增加了在最后范围从0到9 [0,0,0,0,0,0,1,2,3 10个以上的元素, 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已经是几乎一样容易,如果你可以使用提升。