无法访问 class 的矢量成员

cannot access the vector members of a class

我试图访问 class 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;
}

我只是想访问这些值并打印它们,但失败了。没有编译错误。在运行时间,终端没有任何输出。哪里出错了?

调用setTasks()时向量的大小为0。您的迭代器根本不会让您进入 for 循环。您需要考虑您希望 setTasks() 做什么。您打算设置矢量的多少个元素?您应该使用该大小定义矢量,或者使用那么多的 push_back 来将矢量设置为所需的值。

您的矢量为空。尝试给它一个尺寸。例如,vector<int> tasks(10)。参见 option 3 in this

默认构造的 vector 大小为零,因此永远不会进入 setTasks 中的 for 循环(因为 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
}

如果需要,您还可以在 Part 的默认构造函数中设置 vector 的初始大小。在那种情况下添加以下 public 构造函数

Part() : tasks(10)
{}

另一种在构建时设置大小的方法是

class Part{
    vector<int> tasks = vector<int>(10); // requires C++11

或者,您可以使用 "back-insert" 迭代器 (#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 或在构造时指定大小,因为有时由于重新分配而将其推回到向量中会很慢。