参考同一向量的数据在向量中插入

时间:2016-04-04 12:55:07

标签: c++ vector stl stdvector

我目前处于需要复制矢量中某些元素的情况。简而言之,我的代码类似于以下内容:

std::vector<MyStruct> v;
// ...
auto toDuplicate = std::find(v.begin(), v.end(), [](const MyStruct &s) { return true; /*In reality, a bit more complex*/ });
v.insert(toDuplicate, nrOfDuplicates-1, *toDuplicate);
// Signature: insert(iterator, size_t, const value_type &)

因此,在这种情况下,如果容量小于最终容量,则std :: vector必须重新分配其内部数据,使我的引用插入的数据无效。

目前正在使用的STL I(MSVC2013)的实现包含对这种插入的保护,因为如果需要重新分配它将执行我的元素的副本。但是,我不确定我是否能够依赖这种行为,还是需要我自己先复制一份? (在升级到新的STL实现时,我宁愿防止自己看到这种错误)

所以简而言之:我是否允许在一个向量上调用insert()并引用同一向量中的元素?

1 个答案:

答案 0 :(得分:4)

你很好。

如果查看表99(序列容器要求),您会看到,例如a.insert(p,i,j)(其中ij是迭代器)具有前提条件: i和j不是迭代器,而是“。

但是a.insert(p,n,t)的调用n,其中t是一个计数而vector::insert(iter, value)是一个没有这种要求的值。

这在C ++ 11天中被明确提出作为一个问题,并且因为标准不允许它不允许工作,因此它被关闭为NAD,理由是“class bitmapCompare { public enum CompareResult { ciCompareOk, ciPixelMismatch, ciSizeMismatch }; public static CompareResult Compare(bool useHash, Bitmap bmp1, Bitmap bmp2, out double err, out Bitmap diff) { CompareResult cr = CompareResult.ciCompareOk; int er = 0; err = 0; diff = new Bitmap(bmp1.Width, bmp1.Height); //Test to see if we have the same size of image if (bmp1.Size != bmp2.Size) { cr = CompareResult.ciSizeMismatch; err = 100; } else { //Convert each image to a byte array System.Drawing.ImageConverter ic = new System.Drawing.ImageConverter(); byte[] btImage1 = new byte[1]; btImage1 = (byte[])ic.ConvertTo(bmp1, btImage1.GetType()); byte[] btImage2 = new byte[1]; btImage2 = (byte[])ic.ConvertTo(bmp2, btImage2.GetType()); //Compute a hash for each image SHA256Managed shaM = new SHA256Managed(); byte[] hash1 = shaM.ComputeHash(btImage1); byte[] hash2 = shaM.ComputeHash(btImage2); //Compare the hash values if (useHash) { for (int i = 0; i < hash1.Length && i < hash2.Length; i++) { if (hash1[i] != hash2[i]) { er++; cr = CompareResult.ciPixelMismatch; } } } else { int totalPixels = 0; er = 0; for (int x = 0; x < bmp1.Width; x++) { for (int y = 0; y < bmp1.Height; y++) { totalPixels++; if (bmp1.GetPixel(x, y) != bmp2.GetPixel(x, y)) { diff.SetPixel(x, y, Color.Black); er++; cr = CompareResult.ciPixelMismatch; } else diff.SetPixel(x, y, Color.White); } } System.Diagnostics.Debug.WriteLine("Total pixels:{0}", totalPixels); System.Diagnostics.Debug.WriteLine("Diff pixels:{0}", er); if (er > 0) err = (double)er / ((double)bmp1.Height * (double)bmp1.Width); else err = 0; if (err > 0) err = Math.Round(err*100, 1); if (err > 100) err = 100; } } return cr; } ”。工作。“