我有一个包含数据的队列(0到14)。假设0具有索引id 0,1具有索引id 1 ......依此类推
我有两个包含索引ID的向量vector_index_0
和vector_index_1
。基于这些索引ID,我想将队列中的数据复制到两个新的向量,例如vector_data0
和vector_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
// 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" ;
}
}
答案 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)。