gpt4 book ai didi

c++ - 使用迭代器将 std::vector 附加到它自己的元素

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:30 25 4
gpt4 key购买 nike

以下代码按预期工作(测试通过),但我想知道以这种方式使用迭代器在 C++ 中是否被认为是一种不好的做法,或者它是否可以。

也许这是特定于 std::vector 和其他集合的行为不同并且最佳实践因集合(甚至它们的实现)而异?

在其他语言中肯定不行,而且大多数时候更改集合会使迭代器无效并抛出异常。

BOOST_AUTO_TEST_CASE (ReverseIteratorExample) {
std::vector<int> myvector;
for(int i = 0; i < 5; i++)
{
myvector.push_back(i);
}

// is this generally a bad idea to change the vector while iterating?
// is it okay in this specific case?
myvector.reserve(myvector.size() + myvector.size() - 2 );
myvector.insert(myvector.end(), myvector.rbegin() + 1, myvector.rend() -1);

int resultset [8] = { 0,1,2,3,4,3,2,1 };
std::vector<int> resultVector( resultset, resultset + sizeof(resultset)/sizeof(resultset[0]) );
BOOST_CHECK_EQUAL_COLLECTIONS(myvector.begin(), myvector.end(), resultVector.begin(), resultVector.end());
}

问题总结:

  1. 在迭代时更改 vector 通常是个坏主意吗?
  2. 在这种特定情况下可以吗?
  3. 这是特定于 std::vector 和其他集合的行为不同吗?
  4. 最佳做法是否因集合(甚至它们的实现)而异?

最佳答案

这不是有效代码。标准对序列容器操作的定义 (23.2.3@4):

a.insert(p,i,j) - [...] pre: i and j are not iterators into a.

因此您的代码调用未定义的行为,因为它违反了 insert 操作的先决条件。

如果您没有使用 insert,而是编写了一个循环,从 myvector.rbegin() + 1 迭代到 myvector.rend() -1 并在所有值上调用 push_back,您的代码将是有效的:这是因为 push_back 仅在需要重新分配时使 vector 迭代器无效,并且您对 reserve 的调用 确保情况并非如此。

一般来说,虽然在某些情况下可以在迭代容器的同时修改容器(例如上面描述的循环),但您必须确保迭代器不会在这样做时失效。发生这种情况的时间因每个容器而异。

关于c++ - 使用迭代器将 std::vector 附加到它自己的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16174239/

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