std::find返回vec.end(),而不管值是否在vector中

std::find returns vec.end() regardless of whether or not value is in vector

本文关键字:不管 是否 vector 返回 find vec end std      更新时间:2023-10-16

首先,我创建两个指向向量的指针(它们本身通过另一个指针访问)。这不是必要的步骤,但无论我使用的是指针对指针还是指针本身,问题都会持续存在。

std::vector<Int_t> * FV = &DataStorage->fFirstVector;
std::vector<Float_t> * SV = &DataStorage->fSecondVector;

然后我调用find函数。我这样做的目的是,如果firstDatumsecondDatum的值在第一个或第二个向量中分别是而不是,则将这两个值推到它们各自的向量中。

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);
}

问题是firstDatumsecondDatum被推入矢量,无论它们是否已经存在,导致两个矢量充满了许多重复项。向量的大小完全相同,条目的数量与数据点的数量完全相同(因此,并不是第一个子句的求值结果为true,并将重复项推送到第二个向量中)。

我在这里犯了什么明显的错误吗?有人能给我一些建议吗?我已经搞了一段时间了,就是弄不清出了什么问题。我已经检查了所有的数据类型,尝试放弃不必要的指针,等等,但无法弄清楚。

(唯一的限制:我需要使用向量,同样,访问这些向量的唯一方法是通过DataStorage指针。)

#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;
}