std :: vector <float>и double * - Насколько это безопасно? - PullRequest
2 голосов
/ 09 июля 2010

Безопасно ли это делать?

double darray[10];
vector<float> fvector;
fvector.insert(fvector.begin(), darray, darray + 10);  // double to float conversion

// now work with fvector

VS2008 дает мне предупреждение о двойном преобразовании в число с плавающей точкой. Как мне избавиться от этого предупреждения? Я не думаю, что имеет смысл приводить darray к float*, поскольку это изменило бы размер шага (шага) указателя.

Обновление: Я знаю, что указывает предупреждение. Но в отличие от "на плаву"; В сценарии, где я могу легко применить приведение, я не могу устранить предупреждение в этом случае.

Редактировать: Я отредактировал код так, что darray больше не является аргументом функции. Спасибо всем, кто указал на это.

Ответы [ 5 ]

4 голосов
/ 09 июля 2010

Используйте std :: transform (), это позволяет вам предоставить метод преобразования.
Тогда вам просто нужен метод преобразования, который не генерирует предупреждение:

#include <vector>
#include <algorithm>
#include <iterator>

struct CastToFloat
{
    float operator()(double value) const { return static_cast<float>(value);}
};

int main()
{
    double  data[]  = { 1, 2,3,4,5,6,7,8,9,10};
    std::vector<float>  fl;


    std::transform(data, data+10,
                    std::back_inserter(fl),
                    CastToFloat());
}
3 голосов
/ 09 июля 2010

Вы получаете предупреждение, потому что теряете точность в преобразовании double в float, вот и все.Предполагая, что вам действительно нужно fvector, чтобы быть vector<float>, а не vector<double>, ясно, что вы можете жить с этой потерей точности, поэтому предупреждение не имеет значения.

1 голос
/ 09 июля 2010

Предупреждение о потере значащих цифр без явного преобразования. Вы должны получить то же предупреждение для

double d = 1.0;
float f = d;

Вы можете отключить предупреждение для назначения (см. #Pragma warning в MSDN).

0 голосов
/ 09 июля 2010

VS2008 дает мне предупреждение о двойном преобразовании в число с плавающей точкой. Как мне избавиться от этого предупреждения?

void some_function(double *darray){
    vector<double> fvector;
    fvector.insert(fvector.begin(), darray, darray + 10);
}

Или

void some_function(float *darray){
    vector<float> fvector;
    fvector.insert(fvector.begin(), darray, darray + 10);
}

Или перегрузите вашу функцию обоими вариантами, или сделайте ее шаблоном

template<typename RandomAccessIterator>
void some_function(RandomAccessIterator it){
    typedef typename iterator_traits<RandomAccessIterator>::value_type value_type;
    vector<value_type> fvector(it, it + 10);
}

Конечно, не стоит предполагать фиксированный 10. Обратите внимание, что ни ваш исходный код не является безопасным, потому что 10 в списке параметров вашей функции не имеет значения. Это просто игнорируется. Так лучше документировать это ясно, что итератор или указатель должен предоставить доступ к достаточно большому количеству значений.

0 голосов
/ 09 июля 2010

На мой взгляд, есть другая проблема.Вектору не хватает места ...

...