![](/img/trans.png)
[英]What is more efficient: vector.clear() or if(vector.empty()) clear();?
[英]how vector.empty() works?
我想檢查一個特定的向量元素是否已初始化......我用谷歌搜索了它,我發現了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;}
它一直打印“空”!
因為您沒有調用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";
旁注2:您使用了太多new
的 . 讓您的生活更輕松並停止它:
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";
您正在對向量的第三個元素調用empty()
,該元素的類型為std::list*
,並且還有一個empty()
成員 function。
您的代碼打印“空”,因為向量索引 2 處的列表為空。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.