我正在尝试处理一个非常奇怪的问题。我对 STL 容器没有太多经验,所以它们的机制对我来说是个大谜。好了,回到正题。我需要创建一个双端队列 vector ,然后将这个 vector 中的每个现有双端队列分成两半。从现在开始,每一半都将创建单独的双端队列。 我期待这样的事情:
vector{ deque{1,2,3,4,5} } -----> vector { deque{1,2,3}, deque{4,5} }
#include <iostream>
#include <deque>
#include <vector>
int main() {
std::vector< std::deque<int> > vector_of_deques;
vector_of_deques.push_back( std::deque<int>{1, 2, 3, 4, 5} );
std::deque<int> deque = *(vector_of_deques.begin());
int split_position;
if (deque.size() % 2 == 0)
split_position = deque.size() / 2;
else
split_position = int(deque.size() / 2) + 1;
vector_of_deques.emplace_back( deque.begin() + split_position, deque.end() );
deque.erase( deque.begin() + split_position, deque.end() );
for (auto i: vector_of_deques) {
for (auto j: i)
std::cout << j << ", ";
std::cout << std::endl;
}
return 0;
}
输出:
1, 2, 3, 4, 5,
4, 5,
预期:
1, 2, 3,
4, 5,
我完全不知道发生了什么。有人能解释一下为什么我对这些容器的看法是错误的吗?这对我有很大的帮助。
最佳答案
我认为问题出在这里:
std::deque<int> deque = *(vector_of_deques.begin());
您正在制作双端队列的拷贝,而您真正想要的是 std::deque<int>&
.实际上,当您的代码执行此操作时:
deque.erase( deque.begin() + split_position, deque.end() );
您正在从拷贝中删除而不是更改原始 vector 。
关于c++ - 在 vector 中拆分双端队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52863229/