c++ - 在 vector 中拆分双端队列

标签 c++

我正在尝试处理一个非常奇怪的问题。我对 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/

相关文章:

c++ - 指向 char 数组的指针的索引

c++ - 这些宏定义的目的是什么?

c++ - 为什么最低()和最大()之间生成的所有随机数都等于无穷大?

c++ - 当我们说操作系统的控制在程序执行时传递给 main() 函数时,我们是什么意思?

.net - Windows 窗体设计器自定义控件更改在运行时正常工作但在设计时不能正常工作的 anchor

c++ - 有没有办法避免在很多文件中实例化很多模板?

c++ - 有什么方法可以从 Visual Studio 2017 中的 Catch C++ 测试中获取代码覆盖率指标?

c++ - 错误 : 'standardToMilitary' was not declared in this scope

c++ - 未定义的 vtable 引用

c++ - 派生类的构造函数调用的函数在基类中不应该是纯虚拟的