包含其他带有浮点数的向量和另一个整数向量的向量

Posted

技术标签:

【中文标题】包含其他带有浮点数的向量和另一个整数向量的向量【英文标题】:Vector that contain other vectors with a float and another vector of ints 【发布时间】:2020-08-05 22:47:34 【问题描述】:

我正在尝试创建一个向量,其中包含其他带有浮点数的向量和其他整数向量。预期结果:

5.4 1, 5, 4, 6, 9,
4.8, 3, 6, 7, 8, 4,
7.3 , 9, 12, 1, 0, 4

这是我的尝试之一:

#include <iostream>
#include <vector>


using namespace std;


void _cost()
    vector<float, vector<int>> result;

    cout<<"This work";


int main()

    _cost();


    return 0;

在我的所有尝试中,我都收到以下错误:

In file included from /usr/include/c++/7/ext/alloc_traits.h:36:0,
                 from /usr/include/c++/7/bits/basic_string.h:40,
                 from /usr/include/c++/7/string:52,
                 from /usr/include/c++/7/bits/locale_classes.h:40,
                 from /usr/include/c++/7/bits/ios_base.h:41,
                 from /usr/include/c++/7/ios:42,
                 from /usr/include/c++/7/ostream:38,
                 from /usr/include/c++/7/iostream:39,
                 from prueba_dela_prueba.cpp:1:
/usr/include/c++/7/bits/alloc_traits.h: In instantiation of ‘static void std::allocator_traits<_Alloc>::deallocate(_Alloc&, std::allocator_traits<_Alloc>::pointer, std::allocator_traits<_Alloc>::size_type) [with _Alloc = std::vector<float, std::allocator<int> >; std::allocator_traits<_Alloc>::pointer = float*; std::allocator_traits<_Alloc>::size_type = long unsigned int]’:
/usr/include/c++/7/bits/stl_vector.h:180:19:   required from ‘void std::_Vector_base<_Tp, _Alloc>::_M_deallocate(std::_Vector_base<_Tp, _Alloc>::pointer, std::size_t) [with _Tp = float; _Alloc = std::vector<int>; std::_Vector_base<_Tp, _Alloc>::pointer = float*; std::size_t = long unsigned int]’
/usr/include/c++/7/bits/stl_vector.h:162:22:   required from ‘std::_Vector_base<_Tp, _Alloc>::~_Vector_base() [with _Tp = float; _Alloc = std::vector<int>]’
/usr/include/c++/7/bits/stl_vector.h:263:15:   required from ‘std::vector<_Tp, _Alloc>::vector() [with _Tp = float; _Alloc = std::vector<int>]’
prueba_dela_prueba.cpp:9:32:   required from here
/usr/include/c++/7/bits/alloc_traits.h:328:13: error: ‘class std::vector<float, std::allocator<int> >’ has no member named ‘deallocate’; did you mean ‘_M_deallocate’?
        __a.deallocate(__p, __n); 
         ~~~~^~~~~~~~~~
         _M_deallocate

我认为,问题在于 C++ 无法在内存中分配整数向量,但我不知道为什么...

【问题讨论】:

vector 是同质的,即单个向量的所有元素都应该属于同一类型。你到底想达到什么目的? structstd::tuple 会为你工作吗? 哦,好吧,我不知道!非常感谢! 不相关:全局范围内以下划线开头的标识符保留供“实现”使用。打破这条规则很少会咬人,但如果这样做,结果可能会完全令人困惑。更多详情What are the rules about using an underscore in a C++ identifier? 向量的每个元素是否应该包含一个float 一个vector&lt;int&gt;,或者向量的每个元素是否应该包含一个float _or_` 一个vector&lt;int&gt; ? 是的,对不起@user4581301 这是一个类的函数。但我只复制函数以避免不必要的代码!不管怎样,谢谢你的链接,里面有很多知识:) 【参考方案1】:

您似乎想创建一个具有floatint 向量的结构向量;

#include <iostream>
#include <vector>

struct my_data 
    float hoge;
    std::vector<int> fuga;
;

int main() 
    std::vector<my_data> result = 
        5.4 , 1, 5, 4, 6, 9,
        4.8 , 3, 6, 7, 8, 4,
        7.3 , 9, 12, 1, 0, 4
    ;

    for (auto& d : result) 
        std::cout << "[" << d.hoge << "]";
        for (auto& i : d.fuga) 
            std::cout << ", " << i;
        
        std::cout << std::endl;
    

    return 0;

或成对的向量:

#include <iostream>
#include <vector>
#include <utility>

int main() 
    std::vector<std::pair<float, std::vector<int> > > result = 
        5.4 , 1, 5, 4, 6, 9,
        4.8 , 3, 6, 7, 8, 4,
        7.3 , 9, 12, 1, 0, 4
    ;

    for (auto& d : result) 
        std::cout << "[" << d.first << "]";
        for (auto& i : d.second) 
            std::cout << ", " << i;
        
        std::cout << std::endl;
    

    return 0;

【讨论】:

【参考方案2】:

这样的事情应该可以工作:

#include <iostream>
#include <variant>
#include <vector>

int main() 
  std::vector<std::variant<float, std::vector<int>>> v;
  v.push_back(1.0f);
  v.push_back(std::vector<int>1, 2, 3);

  std::cout << std::get<float>(v[0]) << std::endl;
  std::cout << std::get<std::vector<int>>(v[1])[1] << std::endl;

  return 0;

它使用std::variant,这是一个类型安全的联合。

这是我们编译和运行代码时的输出:

% g++ -std=c++17 vec.cc && ./a.out
1
2

(我想打印矢量,但我不太了解 C++。)

【讨论】:

【参考方案3】:

看起来@MikeCAT 已经为您如何创建工作代码给出了合理的答案。

所以目前我将专注于为什么您的代码不起作用,以及错误消息试图告诉您什么。

std::vector 的类型签名是这样的:

template<class T, class Allocator = allocator<T>>
class vector 

因此,使用您的代码:vector&lt;float, vector&lt;int&gt;&gt; result;,您将传递 float 作为将包含在向量中的对象的类型,并将 vector&lt;int&gt; 作为向量将使用的分配器的类型。

分配器是集合用来为其存储的数据分配空间的东西。为此,需要有(除其他外)名为allocatedeallocate 的成员。错误信息告诉你std::vector 没有这些,所以它不能用作分配器。

【讨论】:

非常感谢!我每天都在努力提高我的 c++ 技能,很高兴知道为什么会发生这些事情!

以上是关于包含其他带有浮点数的向量和另一个整数向量的向量的主要内容,如果未能解决你的问题,请参考以下文章

计算 8 个 AVX 单精度浮点向量的 8 个水平和

_mm_shuffle_ps() 等价于整数向量 (__m128i)?

不确定如何将 sklearn 与包含文本和数字的特征向量一起使用

float4数据类型

向量迭代器不可取消引用 C++

进行水平 SSE 向量求和(或其他缩减)的最快方法