gpt4 book ai didi

c++ - emplace_back when 循环相同的列表

转载 作者:搜寻专家 更新时间:2023-10-31 01:11:47 27 4
gpt4 key购买 nike

我向你展示我的问题

我有 2 个列表,将它们命名为 A 和 B。

list<vector<int> > A = {{1},{2},{3}};
list<vector<int> > B = {{4},{5},{6}};

我想要的是 A = {{1,4},{1,5},{1,6},{2,4},{2,5},{2,6},{3 ,4},{3,5},{3,6}} 不使用任何 tmp 列表。

我在 Ubuntu 12.04 上使用 C++11 和 gcc 4.6.3

最小化代码:

auto A_begin = A.begin();
auto A_end = A.end();
auto B_begin = B.begin();
auto B_end = B.end();

for(auto i = A_begin; i != A_end; ++i) //loop on A
{
for (auto j = B_begin;j != B_end; ++j) //loop on B
{
vector<int> tmp = (*i); // A[i]
copy((*j).begin(),(*j).end(),back_inserter(tmp)); // append B[j] to A[i]
A.emplace_back(tmp); //add it to A
}
}
A.erase(A_begin,A_end); // remove {1},{2},{3}

所以,我认为算法没问题,但它在 A 上形成了一个无限循环。我认为当我制作 A.emplace_back 时 A_end 发生了变化,但我保存了它,所以我真的不知道在这里追加什么。

我的识别问题的代码:

auto A_begin = A.begin();
auto A_end = A.end();
auto B_begin = B.begin();
auto B_end = B.end();

int ii = A.size();

for(auto i = A_begin; i != A_end; ++i) //loop on A
{
for (auto j = B_begin;j != B_end; ++j) //loop on B
{
vector<int> tmp = (*i);
A.emplace_back(tmp);
}
cout<<--ii<<endl; // exit when print 0 ?
}

这打印负数,我必须再次 ^C。

编辑:我找到了一个解决方案:

auto A_begin = A.begin();
auto A_end = A.end();
auto B_begin = B.begin();
auto B_end = B.end();

list<vector<int>> tmp_l;

for(auto i = A_begin; i != A_end; ++i) //loop on A
{
for (auto j = B_begin;j != B_end; ++j) //loop on B
{
vector<int> tmp = (*i); // A[i]
copy((*j).begin(),(*j).end(),back_inserter(tmp)); // append B[j] to A[i]
tmp_l.emplace_back(move(tmp)); //add it to A
}
}
swap(tmp_l,A);

最佳答案

这两行:

vector<int> tmp = (*i); // A[i]
copy((*j).begin(),(*j).end(),tmp.end()); // append B[j] to A[i]

将调用未定义的行为。通过复制到 tmp.end(),您只是在 A[i] 结束后覆盖内存,而不是扩展 A[i]。您需要使用 back_insert 迭代器,例如:

vector<int> tmp = (*i); // A[i]
copy((*j).begin(), (*j).end(), back_inserter(tmp)); // append B[j] to A[i]

您还需要包含标题以获取 back_inserter。

编辑:此外,A_end 迭代器指向列表“超过末尾”的位置,因此无论您向 a 添加多少项目,它们总是添加在 A_end 之前,因此无限循环。我不确定是否有解决此问题的好方法。不创建临时列表在这里没有任何好处,无论哪种方式,您都在分配相同的内存,只需写入一个新列表即可。

关于c++ - emplace_back when 循环相同的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14399573/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com