C ++:迭代向量

时间:2010-06-26 15:07:38

标签: c++

我是C ++的新手,我正在尝试用C ++学习矢量。

我写了如下的小程序。我喜欢像C#一样foreach(薪水中的var sal),但它不允许我这样做,所以我用谷歌搜索它,发现我必须使用iterator ..我能够编译并运行这个程序,但我没有得到预期输出..我得到“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);   
}

6 个答案:

答案 0 :(得分:9)

你创建了一个包含5个元素的向量,然后再将10个元素推到最后。这会给你总共15个元素,以及你看到的结果。尝试更改向量的定义(特别是构造函数调用),然后设置。怎么样:

vector<int> salaries;

答案 1 :(得分:3)

此代码创建一个大小为5的向量,并将这5个元素中的每一个初始化为其默认值(0):

vector<int> salaries(5);

push_back插入一个 new 元素,所以在这里,你插入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); 
}

答案 2 :(得分:2)

当你申报工资(5)时,它会在向量中添加5个条目,其值为0.然后你的循环增加0..9。因此,在向量中有15个元素而不是10个。尝试在没有5的情况下声明向量。

vector<int> salaries;

答案 3 :(得分:0)

vector<int> salaries(5);表示您正在创建从一开始就包含5个int个对象的向量,并且每个int对象都使用默认构造函数进行初始化,并且在{{ 1}} contructor设置零值。这就是为什么你在向量容器的开头有5个零整数。

答案 4 :(得分:0)

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

您还可以提前reserve数组中的某些容量,这与重新调整大小完全不同。保留简单地保留“至少”向量的那么多容量(但不改变向量的大小),而调整大小时添加\从向量中删除元素以使其成为请求的大小。

答案 5 :(得分:0)

vector<int> salaries(5);

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

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

这在末尾增加了10个元素,范围从0到9 [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那么几乎一样容易。