std :: find返回vec.end(),无论值是否在向量中

时间:2014-09-30 13:17:02

标签: c++ c++11 vector find

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

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 指针。)

1 个答案:

答案 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;
}