C++ vector.empty()是如何工作的?

C++ vector.empty()是如何工作的?,c++,vector,C++,Vector,我想检查一个特定的向量元素是否被初始化。。。 我在谷歌上搜索,发现vector::empty 但它似乎对我不起作用,因为它在任何情况下都会不断返回true int main() { int n, k; cin >> n >> k; auto tasks = new vector<list<int> *>(n); tasks->insert(tasks->begin(), new list<int>); tasks->i

我想检查一个特定的向量元素是否被初始化。。。 我在谷歌上搜索,发现
vector::empty
但它似乎对我不起作用,因为它在任何情况下都会不断返回
true

int main() {
int n, k;
cin >> n >> k;
auto tasks = new vector<list<int> *>(n);
tasks->insert(tasks->begin(), new list<int>);
tasks->insert(tasks->begin() + 1, new list<int>);
tasks->insert(tasks->begin() + 2, new list<int>);
tasks->insert(tasks->begin() + 3, new list<int>);
tasks->insert(tasks->begin() + 4, new list<int>);
if (tasks->at(2)->empty()) cout << "empty";
return 0;}
intmain(){
int n,k;
cin>>n>>k;
自动任务=新向量(n);
任务->插入(任务->开始(),新列表);
任务->插入(任务->开始()+1,新列表);
任务->插入(任务->开始()+2,新列表);
任务->插入(任务->开始()+3,新列表);
任务->插入(任务->开始()+4,新列表);

如果(tasks->at(2)->empty())因为没有调用
std::vector::empty()
,而无法调用
std::list::empty()

在向量的开头插入5个空列表,然后对索引2处的列表调用
empty()


旁注:您的向量是用
n
列表创建的,然后再插入5个。您确定这是预期行为吗

此外,使用
insert()
效率低下。由于您的所有列表都是空的,因此在何处插入新列表并不重要,因此您也可以在末尾添加新列表。您可以通过调整向量大小来实现此目的:

auto tasks = vector<list<int>>(n);
tasts.resize(n+5); //or just construct vector with n+5 lists initially
if (tasks.at(2).empty()) cout << "empty";

您正在对向量的第三个元素调用
empty()
,该元素的类型为
std::list*
,并且还有一个
empty()
成员函数


您的代码打印“empty”,因为向量索引2处的列表是空的。

您正在调用内部
列表上的
empty
,该列表是空的。
新向量(n);
nope nope nope nope。请不要!要调用向量的empty(不在列表中),
如果(任务->empty())CUT几乎不需要指针到一个标准容器。你是从一个语言中来的吗?你必须使用<代码>新< /Cord>来创建对象(比如java或C++),C++是不需要的。创建一个包含
n
元素的向量对象,每个元素都是一个整数列表。通常,除非您有特殊要求,“默认”容器应该始终是
std::vector
。您似乎误解了
empty
的作用。它检查向量是否为空(即,它的大小为零),它不检查特定元素是否已初始化。向量元素始终已初始化,因此不需要对此进行检查。
push_back
better@AsteroidsWithWings
resize()
会更好,我会加上这一点。非常感谢!很抱歉代码太乱了XD。我是新来的,你知道:)
auto tasks = vector<list<int>>(n);
tasks.insert(tasks.begin(), list<int>{});
tasks.insert(tasks.begin() + 1, list<int>{});
tasks.insert(tasks.begin() + 2, list<int>{});
tasks.insert(tasks.begin() + 3, list<int>{});
tasks.insert(tasks.begin() + 4, list<int>{});
if (tasks.at(2).empty()) cout << "empty";