c语言 中insert变量值,c – 在VS2010中的vector :: insert执行意外结果
我偶爾會(huì)在VS2010中發(fā)現(xiàn)一個(gè)奇怪的問(wèn)題,下一個(gè)代碼:
void Test1()
{
std::vector vec;
vec.push_back(10);
vec.push_back(20);
vec.insert(vec.end(),vec[0]);
// GCC: vec == [10,20,10];
// VS2005: vec == [10,10];
// VS2010: vec == [10,-17891602];
}
看起來(lái),vector會(huì)在讀取新值之前重新分配內(nèi)存并刪除舊內(nèi)存,從而導(dǎo)致復(fù)制損壞的值.此問(wèn)題出現(xiàn)在VS2010中.在VS2005和GCC中檢查 – 確定.
傳遞給insert()從operator []或front()/ back()方法獲取的引用是否有效?
UPD:根據(jù)以下評(píng)論做了一些調(diào)查,我得出結(jié)論,因?yàn)樾阅?使用reserve()不是一個(gè)好主意.它導(dǎo)致不必要的大量重新分配.
void Test2()
{
std::vector vec,vec2;
const int count = 10000;
int prevCap = 0,reallocCount = 0;
int prevCap2 = 0,reallocCount2 = 0;
for (int i = 0; i < count; ++i)
{
if (vec.size() >= vec.capacity())
{
vec.reserve(vec.size()+1);
}
vec.insert(vec.end(),i);
vec2.insert(vec2.end(),i);
const int cap = vec.capacity();
const int cap2 = vec2.capacity();
if (prevCap != cap) ++reallocCount;
prevCap = cap;
if (prevCap2 != cap2) ++reallocCount2;
prevCap2 = cap2;
}
cout << reallocCount << " " << reallocCount2 << endl;
// reallocCount == 10000,reallocCount2 == 15 GCC
}
所以現(xiàn)在我只有兩個(gè)選擇:
1)使用臨時(shí)變量
const int tempValue = vec[0];
vec.insert(vec.end(),tempValue);
但是我不確定編譯器是否可以通過(guò)某些優(yōu)化來(lái)刪除tempValue.
2)使用push_back(0)和進(jìn)一步的pop_back()調(diào)用
vec.push_back(0);
vec.pop_back();
vec.insert(vec.end(),vec[0]);
這種方法似乎更好,它在VS2005 / 2010和GCC中給出了預(yù)期的結(jié)果和性能.
我錯(cuò)過(guò)了什么?有更好的解決方案嗎?
總結(jié)
以上是生活随笔為你收集整理的c语言 中insert变量值,c – 在VS2010中的vector :: insert执行意外结果的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c语言数组数据的输入,在C语言中,数组中
- 下一篇: c语言 offsetof函数,C 库宏