2014-10-09 74 views
-1

我已經宣佈了一個向量對int和向量爲vector<pair<int,vector<int> > v(10)。現在我想使用清除功能v[i].clear(),並期望它將清除行v[i]。但編譯器會引發錯誤。請幫助我正確使用clear()函數來清除此向量聲明中的特定行,或者向我建議另一種方法。如何清除()內部矢量的矢量類型<pair <int,vector>>?

回答

0

如果你想消滅i行,那麼你要刪除:

v.erase(v.begin() + i); 

在你的榜樣,這會減少矢量的大小,只剩下9個元素。另一方面,如果要重新初始化第i行,以便它包含與第一次創建向量時包含的10個元素相同的內容,那麼您希望:

v[i] = pair<int, vector<int> >(); 

- 或 -

v[i].first = 0; 
v[i].second.clear(); 
+0

...是的,這就是我真正想要的......但我不知道'v [i] .second.clear()'會做同樣的事情..糾正我,如果我錯了:/ – Roshan 2014-10-09 23:27:43

+1

'vector :: erase '需要一個迭代器而不是索引,所以這段代碼不起作用。 – b4hand 2014-10-09 23:28:28

+0

它幾乎做同樣的事情; v [i] .second.clear()不會清除v [i] .first。 – jorgbrown 2014-10-09 23:29:24

0

您的外層std::vector包含std::pair s和clearstd::vector而非std::pair的方法。它看起來像您可能意味着這樣的:

v[i].second.clear(); 

如果你想從載體刪除整個個元素,那麼這是不是你問一個不同的問題。相反,你可以將其刪除這種方式:

v.erase(v.begin() + i); 

如果你想完全復位個元素,那麼你就應該默認構造這樣的值:

v[i] = pair<int, vector<int> >(); 

或像這樣:

v[i] = std::make_pair(0, std::vector<int>()); 

而且,請注意,調用clear沒有了「保留」的空間裏,真正自由了矢量裏面,所以如果您的載體是重盟友大,你想真正擺脫所有的內存,那麼你需要分配一個空的(默認構造)向量。或者,你可以調用使用swap-與空成語:

v[i].second.swap(std::vector<int>()); 
+0

哦,是我不好! :)非常感謝你!1 – Roshan 2014-10-09 23:20:19

+0

不,我只是想初始化第i行 – Roshan 2014-10-09 23:33:19

+1

'v.erase [&v [i]]'不會編譯。 'v.erase(&v [i])'可以編譯,但不能保證:'vector :: iterator'不一定是'T *'。 – aschepler 2014-10-10 00:00:27