无法访问 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
或在构造时指定大小,因为有时由于重新分配而将其推回到向量中会很慢。
我试图访问 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
或在构造时指定大小,因为有时由于重新分配而将其推回到向量中会很慢。