在 C++ 中将队列复制到向量是错误的
Wrong to copy queue to vector in C++
我有一个包含数据(0 到 14)的队列。假设 0 的索引 id 为 0,1 的索引 id 为 1...等等
我有两个包含索引 ID 的向量 vector_index_0
和 vector_index_1
。基于这些索引 ID,我想将数据从队列复制到两个新向量,例如 vector_data0
和 vector_data1
(vector_index_0 用于 vector_data0 和 vector_index_1 vector_data1)
比如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
// 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" ;
}
}
我相信您看到输出的原因是代码中的这一行:
if (vec_index_01[index]<vec0_size)
vec0_size
是 3 基于你的 0 向量的大小。您的 vec_index_01
向量包含 1,2,然后是 5。从那里开始的所有内容都大于 5。一旦 index
为 2 或更大,您将永远不会拥有此 if 语句 return true。基本上,此 if 语句仅在 index
< 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" ;
}
}
编辑
我认为我的第一个答案不是 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
问题出在if条件(vec_index_01[index] < vec0_size),应该是(index0 < vec0_size).
我有一个包含数据(0 到 14)的队列。假设 0 的索引 id 为 0,1 的索引 id 为 1...等等
我有两个包含索引 ID 的向量 vector_index_0
和 vector_index_1
。基于这些索引 ID,我想将数据从队列复制到两个新向量,例如 vector_data0
和 vector_data1
(vector_index_0 用于 vector_data0 和 vector_index_1 vector_data1)
比如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
// 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" ;
}
}
我相信您看到输出的原因是代码中的这一行:
if (vec_index_01[index]<vec0_size)
vec0_size
是 3 基于你的 0 向量的大小。您的 vec_index_01
向量包含 1,2,然后是 5。从那里开始的所有内容都大于 5。一旦 index
为 2 或更大,您将永远不会拥有此 if 语句 return true。基本上,此 if 语句仅在 index
< 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" ;
}
}
编辑
我认为我的第一个答案不是 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
问题出在if条件(vec_index_01[index] < vec0_size),应该是(index0 < vec0_size).