首先,我创建两个指向向量的指针(它们本身通过另一个指针访问)。这不是必要的步骤,但无论我是否使用指针指针或指针本身,问题仍然存在。
std::vector<Int_t> * FV = &DataStorage->fFirstVector;
std::vector<Float_t> * SV = &DataStorage->fSecondVector;
然后我调用find函数。我这样做的目的是,如果值 firstDatum 和 secondDatum 分别在第一个或第二个向量中不,则按 both < / em>将值放入各自的向量中。
if( std::find(FV->begin(), FV->end(), firstDatum) == FV->end()
or std::find(SV->begin(), SV->end(), secondDatum) == SV->end() )
{
FV->push_back(firstDatum);
SV->push_back(secondDatum);
}
问题是 firstDatum 和 secondDatum 正被推入向量,无论它们是否已经存在,导致两个向量填充了许多重复项。向量的大小完全相同,条目与数据点完全相同(因此不是第一个子句评估为true,而是将副本推入第二个向量)。
我在这里犯了什么明显的错误?谁能给我一些建议?我现在已经搞砸了一段时间,只是无法弄清楚出了什么问题。我检查了所有数据类型,尝试放弃不必要的指针等,但无法弄明白。
(唯一的限制:我需要使用向量,同样访问这些向量的唯一方法是通过 DataStorage 指针。)
答案 0 :(得分:-1)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void Push_if_not_found(
std::vector<int> * FV,
std::vector<float> * SV,
int firstDatum,
float secondDatum )
{
if( std::find( FV->begin(), FV->end(), firstDatum ) == FV->end() )
{
FV->push_back(firstDatum);
}
if( std::find( SV->begin(), SV->end(), secondDatum ) == SV->end() )
{
SV->push_back(secondDatum);
}
}
int main()
{
struct ds
{
std::vector<int> fFirstVector;
std::vector<float> fSecondVector;
} ds1;
ds1.fFirstVector.push_back(1);
ds1.fSecondVector.push_back(1);
ds * DataStorage = &ds1;
std::vector<int> * FV = &DataStorage->fFirstVector;
std::vector<float> * SV = &DataStorage->fSecondVector;
Push_if_not_found( FV, SV, 1, 1 );
if( FV->size() != 1 || SV->size() != 1)
{
cout << "FAILED" << endl;
return 0;
}
Push_if_not_found( FV, SV, 2, 1 );
if( FV->size() != 2 || SV->size() != 1)
{
cout << "FAILED" << endl;
return 0;
}
Push_if_not_found( FV, SV, 2, 2 );
if( FV->size() != 2 || SV->size() != 2)
{
cout << "FAILED" << endl;
return 0;
}
Push_if_not_found( FV, SV, 3, 3 );
if( FV->size() != 3 || SV->size() != 3)
{
cout << "FAILED" << endl;
return 0;
}
for( auto v : ds1.fFirstVector )
{
cout << v << " ";
}
cout << endl;
for( auto v : ds1.fSecondVector )
{
cout << v << " ";
}
cout << endl;
return 0;
}