我试图访问类Part
中成员类型为tasks
的类#include <iostream>
#include <vector>
using namespace std;
class Part{
vector<int> tasks;
public:
void setTasks(void);
void getTasks(void);
};
void Part::setTasks(void){
vector<int>::iterator it;
int i=1;
for (it = this->tasks.begin(); it != this->tasks.end(); ++it)
{
*it=i;
i=i+1;
}
}
void Part::getTasks(void){
vector<int>::iterator it;
for (it = this->tasks.begin(); it != this->tasks.end(); ++it)
cout<<*it<<"\t";
}
int main()
{
Part one;
one.setTasks();
one.getTasks();
return 0;
}
的成员。
{{1}}
我只是试图访问这些值并打印它们但失败了。没有编译错误。在运行时,终端中没有输出任何内容。错误在哪里?
答案 0 :(得分:3)
默认构造的vector
大小为零,因此永远不会输入for
中的setTasks
循环(因为begin()
和end()
迭代器是相同的在那时候)。如果您将初始大小设置为vector
,则代码将按预期工作。例如,尝试在setTasks
tasks.resize(10); // sets vector size to 10 elements, each initialized to 0
编写该函数的另一种方法是
#include <numeric>
...
void Part::setTasks(void){
tasks.resize(10);
std::iota(tasks.begin(), tasks.end(), 1); // requires C++11
}
如果您愿意,还可以在vector
的默认构造函数中设置Part
的初始大小。在这种情况下,添加以下公共构造函数
Part() : tasks(10)
{}
另一种在施工时设定尺寸的方法是
class Part{
vector<int> tasks = vector<int>(10); // requires C++11
答案 1 :(得分:1)
致电setTasks()
时,向量的大小为0。你的迭代器根本不会让你进入for循环。您需要考虑您希望setTasks()
做什么。您打算设置了多少元素?您应该使用该大小定义矢量,或者使用那么多push_back
来代替将矢量设置为所需的值。
答案 2 :(得分:0)
你的矢量是空的。试着给它一个尺寸。例如,vector<int> tasks(10)
。请参阅option 3 in this。
答案 3 :(得分:0)
或者,你可以使用&#34; back-insert&#34;迭代器(#include <iterator>
),内部调用std::vector::push_back
,如下所示:
void Part::setTasks(void){
auto back_it = std::back_inserter(tasks);
for(int i = 0; i < 10; ++i)
*back_it++ = i;
}
这种迭代器在目标大小未知的算法中特别有用。虽然如果你事先知道大小,你应该使用reserve/resize
或指定构造的大小,因为重新分配后推回到向量有时会很慢。