在C ++中将队列复制到向量是错误的

时间:2015-12-29 06:46:26

标签: c++ vector queue

我有一个包含数据的队列(0到14)。假设0具有索引id 0,1具有索引id 1 ......依此类推

我有两个包含索引ID的向量vector_index_0vector_index_1。基于这些索引ID,我想将队列中的数据复制到两个新的向量,例如vector_data0vector_data1(vector_data0的vector_index_0和vector_data1的vector_index_1)

例如,vector_index_0的第一个元素是1,因此我将索引id为1的数据复制到vector_data0,即1,...

这是我的代码。我不知道为什么输出结果会给出错误的答案。你能帮帮我吗

我的预期结果必须是

 First data 
1   2  5    
 Second data 
6   8   9   10

但我目前来自以下代码的结果是

 First data 
1   2   
 Second data 
5   6   8   9   10

Live demo

// Example program
#include <iostream>
#include <string>
#include <vector>
#include <queue>

using std::queue;
int main()
{
    std::vector<int> vec_index_0{1,2,5};
    std::vector<int> vec_index_1{6,8,9,10};
    std::vector<int> vec_index_01{1,2,5,6,8,9,10};//Combine vector index 0 and 1
    queue<int> queue_data;
    std::vector<int> vec_data0;
    std::vector<int> vec_data1;
    int index=0;
    int index0=0;
    int index1=0;
    int j=0;    
    int vec0_size=vec_index_0.size();
    std::cout <<"Queue data"<<"\n";
    for (int i=0;i<15;i++){
        queue_data.push(i);
        std::cout<< i <<"\t";
    }
    while (!queue_data.empty()) {
        if(vec_index_01[index]==j) {
            if (vec_index_01[index]<vec0_size) {
                vec_data0.push_back(queue_data.front());
                index0++;
            }
            else {
                 vec_data1.push_back(queue_data.front());
                 index1++;
                }
            index++;
            queue_data.pop();
        }
        else {
            queue_data.front();
            queue_data.pop();
        }  

        j++;
    }
    std::cout<<"\n First data \n";
    for(int i=0;i<index0;i++){        
        std::cout << vec_data0[i] <<"\t";
    }
    std::cout<<"\n Second data \n";
    for(int i=0;i<index1;i++){        
        std::cout << vec_data1[i]<<"\t" ;
    }
}

3 个答案:

答案 0 :(得分:1)

我相信您看到输出的原因是代码中的这一行:

if (vec_index_01[index]<vec0_size)
根据0向量的大小,

vec0_size为3。你的vec_index_01向量包含1,2然后5.从那里开始的一切都大于5.一旦index为2或更大,你将永远不会有这个if语句返回true。基本上,这个if语句只有index&lt; 2。

编辑 - 我认为这会简化您的代码

int index0=0;
int index1=0;
int queueIndex = 0;
while(!queue_data.empty()) {
    if (index0 < vec_index_0.size() && vec_index_0[index0] == queueIndex) {
        vec_data0.push_back(queue_data.front());
        ++index0;
    } else if (index1 < vec_index_1.size() && vec_index_1[index1] == queueIndex) {
        vec_data1.push_back(queue_data.front());
        ++index1;
    }
    queue_data.pop();
    ++queueIndex;
}

我测试了上面的代码,它产生了你正在寻找的输出。这是你的整个程序清理了一下:

#include <iostream>
#include <string>
#include <vector>
#include <queue>

using std::queue;
int main()
{
    std::vector<int> vec_index_0{1,2,5};
    std::vector<int> vec_index_1{6,8,9,10};
    queue<int> queue_data;
    std::vector<int> vec_data0;
    std::vector<int> vec_data1;

    std::cout <<"Queue data"<<"\n";
    for (int i=0;i<15;i++){
        queue_data.push(i);
        std::cout<< i <<"\t";
    }

    int index0=0;
    int index1=0;
    int queueIndex = 0;
    while(!queue_data.empty()) {
        if (index0 < vec_index_0.size() && vec_index_0[index0] == queueIndex) {
            vec_data0.push_back(queue_data.front());
            ++index0;
        } else if (index1 < vec_index_1.size() && vec_index_1[index1] == queueIndex) {
            vec_data1.push_back(queue_data.front());
            ++index1;
        }
        queue_data.pop();
        ++queueIndex;
    }

    std::cout<<"\n First data \n";
    for(int i=0;i<index0;i++){        
        std::cout << vec_data0[i] <<"\t";
    }
    std::cout<<"\n Second data \n";
    for(int i=0;i<index1;i++){        
        std::cout << vec_data1[i]<<"\t" ;
    }
}

修改
如果您要使用多组唯一索引来分割数据,则可能需要考虑实际使用std::set而不是std::vector作为索引集合。然后你可以使用find函数来查看索引是否在集合中。 std::set::find在查找时间内是对数的。如果您关注对数查找时间,您还可以考虑具有恒定时间查找的std::unordered_set。以下是使用std::set

的代码
#include <string>
#include <vector>
#include <queue>
#include <set>

using std::queue;
int main()
{
    std::set<int> set_index_0{1,2,5};
    std::set<int> set_index_1{6,8,9,10};
    queue<int> queue_data;
    std::vector<int> vec_data0;
    std::vector<int> vec_data1;

    std::cout <<"Queue data"<<"\n";
    for (int i=0;i<15;i++){
        queue_data.push(i);
        std::cout<< i <<"\t";
    }

    int queueIndex = 0;
    while(!queue_data.empty()) {
        if (set_index_0.find(queueIndex) != set_index_0.end()) {
            vec_data0.push_back(queue_data.front());
        } else if (set_index_1.find(queueIndex) != set_index_1.end()) {
            vec_data1.push_back(queue_data.front());
        }
        queue_data.pop();
        ++queueIndex;
    }

    std::cout<<"\n First data \n";
    for(auto&& it : vec_data0){        
        std::cout << it <<"\t";
    }
    std::cout<<"\n Second data \n";
    for(auto&& it : vec_data1){        
        std::cout << it <<"\t" ;
    }
}

答案 1 :(得分:1)

修改

我认为我的第一个答案不是OP想要的。

也许下面的代码更像是它。代码执行以下操作:

// if N is present in vec_index_0 -> copy queue element number N to vec_data0
// if N is present in vec_index_1 -> copy queue element number N to vec_data1
// if N is not present in any vec_index -> ignore queue element number N

std::vector<int> vec_index_0{1,2,5};
std::vector<int> vec_index_1{6,8,9,10};

queue<int> queue_data;
std::vector<int> vec_data0;
std::vector<int> vec_data1;
int index=0;

std::cout <<"Queue data"<<"\n";
for (int i=0;i<15;i++)
{
    queue_data.push(i);
    std::cout<< i <<"\t";
}

while (!queue_data.empty())
{
    if ( std::find(vec_index_0.begin(), vec_index_0.end(), index) != vec_index_0.end() )
    {
        // Current queue index found in index vector 0 - copy to data vector 0
        vec_data0.push_back(queue_data.front());
    }
    else if ( std::find(vec_index_1.begin(), vec_index_1.end(), index) != vec_index_1.end() )
    {
        // Current queue index found in index vector 1 - copy to data vector 1
        vec_data1.push_back(queue_data.front());
    }

    // Remove element from queue and increment index
    queue_data.pop();
    index++;
}

std::cout<<"\n First data \n";
for(auto& e : vec_data0)
{
    std::cout << e <<"\t";
}
std::cout<<"\n Second data \n";
for(auto& e : vec_data1)
{
    std::cout << e <<"\t";
}

输出:

Queue data
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

First data 
1 2 5   
Second data 
6 8 9 10

如果我们将其他值放在队列中,如下所示:

std::cout <<"Queue data"<<"\n";
for (int i=0;i<15;i++)
{
    queue_data.push(2*i + 8);  // Changed here
    std::cout<< (2*i+8) <<"\t";
}

它给出了:

Queue data
8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 
First data 
10 12 18    
Second data 
20 24 26 28 

答案 2 :(得分:1)

问题出现在条件(vec_index_01 [index]&lt; vec0_size)中,它应该是(index0&lt; vec0_size)。