我是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);
}
答案 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那么几乎一样容易。