2

我有一个存储矩阵对角线的 STL 向量。我正在实施的某个数学规则告诉我,我可以简单地通过获取原始向量并将该向量的副本连接到自身来生成张量积对角线的新矩阵(它的大小加倍,并且值在 1/ 之后重复) 2 * 大小())。

我写了以下代码:

std::vector<int> aVec;

for (int k = 0; k < aVec.size(); k++) aVec.insert(aVec.end(), aVec[k]);

但是当我尝试这个时,我得到了段错误。如果我创建 aVec 的副本并将其用作插入“值”,并将其用于循环参数中的 size(),它将起作用,但我必须做这两件事(否则我仍然会得到段错误)。

任何人都可以解释导致此实现不起作用的原因吗?

4

3 回答 3

4

使用基于迭代器的操作:

vec.reserve(vec.size() * 2);
vec.insert(vec.end(), vec.begin(), vec.end());
于 2012-07-16T19:31:15.087 回答
3

您将无限期地复制项目。注意要预先复制多少:

size_t n = aVec.size();
for (int k = 0; k != n; ++k)
  aVec.push_back(aVec[k]);

虽然许多 C++ 算法使用begin()end()迭代器可以更好地表达,但在这种情况下,通过索引的访问更为优越,因为修改容器可能会使迭代器无效,但元素访问将保持有效。但是,您可以使用reserve来避免这种失效:

aVec.reserve(2*aVec.size());
std::copy(aVec.begin(), aVec.end(), std::back_inserter(aVec));
于 2012-07-16T19:29:55.087 回答
1

在开始向 aVec 添加元素之前,您应该读取一次 aVec.size() 的值。

于 2012-07-16T19:29:31.567 回答