3 回答

TA貢獻(xiàn)1802條經(jīng)驗 獲得超5個贊
因此,實際上,在調(diào)用resize()時,通過添加適當(dāng)數(shù)量的val副本來擴大向量。但是,通常,我只需要知道向量足夠大即可容納我需要的數(shù)據(jù)。我不需要將其初始化為任何值。復(fù)制構(gòu)造新值只是浪費時間。
不,不是。擁有實際上沒有構(gòu)造的元素的容器是沒有意義的。我不確定您希望看到的不是零。未指定/未初始化的元素?這不是價值初始化的意思。
如果您需要N個元素,那么您應(yīng)該有N個正確構(gòu)造的元素,這就是需要的std::vector::resize。值初始化將使對象初始化為零,而沒有默認(rèn)構(gòu)造函數(shù)可調(diào)用,因此,實際上這與您想要的相反,安全性和初始化程度較低,而不是更多。
我建議你真正想要的是std::vector::reserve。
這似乎表明std::vector<T>界面更改并未真正起任何作用
它肯定會產(chǎn)生作用,但不是您要尋找的那個。新的resize重載是為了方便起見,因此當(dāng)您只需要默認(rèn)或什至值初始化時,您就不必構(gòu)造自己的臨時文件。這不是容器工作方式的根本變化,而是它們始終持有有效的?類型的?實例。
?有效,但如果您離開它們,則處于未指定狀態(tài)!

TA貢獻(xiàn)1951條經(jīng)驗 獲得超3個贊
還有就是用C ++ 11個小功能上的差異resize簽名,但您的測試不會揭露它??紤]類似的測試:
#include <iostream>
#include <vector>
struct X
{
X() {std::cout << "X()\n";}
X(const X&) {std::cout << "X(const X&)\n";}
};
int
main()
{
std::vector<X> v;
v.resize(5);
}
在C ++ 03下打?。?/p>
X()
X(const X&)
X(const X&)
X(const X&)
X(const X&)
X(const X&)
但是在C ++ 11下它會打印:
X()
X()
X()
X()
X()
進行此更改的動機是為了更好地支持中的不可復(fù)制(僅移動)類型vector。在大多數(shù)情況下,包括您的情況在內(nèi),此更改都沒有影響。
有一種方法可以通過使用自定義分配器(您的編譯器可能支持或可能不支持)來完成C ++ 11中的目標(biāo):
#include <iostream>
#include <vector>
using namespace std;
template <class T>
class no_init_alloc
: public std::allocator<T>
{
public:
using std::allocator<T>::allocator;
template <class U, class... Args> void construct(U*, Args&&...) {}
};
template <typename VecType>
void init_vec(VecType &v)
{
// fill v with values [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
v.resize(10);
for (size_t i = 0; i < 10; ++i) v[i] = i; // Note this change!!!
// chop off the end of v, which now should be [1, 2, 3, 4, 5], but the other 5 values
// should remain in memory
v.resize(5);
}
template <typename VecType>
void print_vec(const char *label, VecType &v)
{
cout << label << ": ";
for (size_t i = 0; i < v.size(); ++i)
{
cout << v[i] << ' ';
}
cout << endl;
}
int
main()
{
std::vector<int, no_init_alloc<int>> std_vec;
init_vec(std_vec);
std_vec.resize(10);
print_vec("std", std_vec);
}
哪個應(yīng)該輸出:
std: 0 1 2 3 4 5 6 7 8 9
在no_init_alloc簡單地拒絕做任何初始化,這是罰款int,有一個未確定的值離開它。我不得不更改您init_vec使用賦值來初始化而不是使用構(gòu)造。因此,如果您不小心,可能會很危險/令人困惑。但是,它的確避免了不必要的初始化。
- 3 回答
- 0 關(guān)注
- 809 瀏覽
添加回答
舉報