当前位置: 首页 > 知识库问答 >
问题:

如何获得矢量::value_type?

凤高翰
2023-03-14

我想得到向量中包含的类型的sizeof。以下是我尝试的内容:

#include <iostream>
#include <vector>

int main()
{
    std::vector<uint> vecs;
    std::cout << sizeof(vecs.value_type) << std::endl;
    return 0;
}

据我的理解,这应该是正确的。然而,当使用GCC 4.8.1编译时,我得到的是:

test-sizeof.cpp: In function ‘int main()’:
test-sizeof.cpp:7:27: error: invalid use of ‘std::vector<unsigned int>::value_type’
  std::cout << sizeof(vecs.value_type) << std::endl;
                           ^

我做错了什么?如何获取包含的类型的大小?

共有3个答案

羊毅庵
2023-03-14

我更喜欢更简洁的:

sizeof(vecs[0])

乍一看这似乎不安全,因为当vecs是零长度向量时会发生什么?

对于这个示例,其中sizeof()运算符的参数是在值类型上调用的,sizeof()运算符是在编译时执行的,因此vecs[0]永远不会导致分段故障或崩溃。

p、 只有当参数是可变长度数组(来自C或GNU C扩展名)时,才会在运行时计算s.sizeof()

谢俊英
2023-03-14

成员访问运算符 只能用于访问类的数据成员和成员函数,而不能用于访问其他嵌套名称,例如类型名称。您需要作用域解析运算符来访问它们,并且只能应用于类名(或别名),而不是类类型的对象:

std::vector<uint>::value_type

在C 11或更高版本中,如果您有一个对象并且无法方便地访问该类型,则decltype可以为您提供一个类型名称:

decltype(vecs)::value_type
公孙芷阳
2023-03-14

3.4.3限定名称查找[basic.lookup.qual]

1类或命名空间成员或枚举器的名称可以在应用于表示其类、命名空间或枚举的嵌套名称规范的::scope解析运算符(5.1)之后引用。如果嵌套名称规范中的::scope解析运算符前面没有decltype规范,则在查找::之前的名称时,只考虑专门化为类型的命名空间、类型和模板。如果找到的名称未指定命名空间或类、枚举或依赖类型,则程序的格式不正确。

在这种情况下,您正在从类模板专门化std::vector访问类型成员

std::vector<uint>::value_type

如果您实际上在模板代码中并且想要例如。访问相同的嵌套类型,您需要在其前面加上关键字typename,如下所示:

typename std::vector<T>::value_type

在C 11中,您可以使用sizeof(Dectype(vecs)::value_type)sizeof(Dectype(vecs.back ())),如果您不知道类型的确切名称,但知道如何通过back()等成员函数访问它们,后者会很方便。

注意:正如@Casey在评论中指出的那样,decltype需要剥离引用才能获得类型本身,但出于sizeof目的这无关紧要。

 类似资料:
  • 矢量或者说向量,可以通过2~4个分量表示一个向量,比如通过vec3(1,0,0)表示三维空间中一个沿着x轴正方向的三维方向向量,如果你有高中数学的基础,应该对向量有一定的了解,对于三维坐标的相关几何运算也有一定的概念。 关键字 数据类型 vec2 二维向量,具有xy两个分量,分量是浮点数 vec3 三维向量 ,具有xyz三个分量,分量是浮点数 vec4 四维向量 ,具有xyzw四个分量,分量是浮点

  • 问题内容: 我将JComboBox与自定义类对象一起使用,并且equals方法被覆盖,并且非常深入地集成到代码中。 问题是,如果在JComboBox下拉列表中两个对象相等,那么如果选择了一个,则全部选中,并且get selected索引返回-1。 有没有一种方法可以将a强制转换为a ?我试过了 和 其中是的父项,是的扩展项,但它们都不编译。 我需要的只是JComboBox,不要使用重写的equal

  • Vector是由连续整数索引的值的集合。 使用Clojure中的矢量方法创建矢量。 例子 (Example) 以下是在Clojure中创建矢量的示例。 (ns clojure.examples.example (:require [clojure.set :as set]) (:gen-class)) (defn example [] (println (vector 1 2 3

  • 问题内容: 我认为我在正确的PHP和AJAX文件之间传递变量的方式不正确。 我正在通过触发PHP文件中的第二个条件来调试它。 目前,对于“ signup_process.php AJAX 我知道第二个条件正在被触发,因为我在其中放置了一个标头重定向,仅用于测试,它工作正常。 问题答案: 在将数据从php返回到ajax时很好用 json 。 现在,如果要将json数据返回给ajax,则需要将 返回数

  • 我有一个相机旋转矩阵3x3,然后我用罗德里格斯函数从旋转矩阵中得到旋转矢量,但是它给出的结果像,但是OpenGL函数需要度数。我认为是归一化的,我应该把每个元素乘以360来得到度数。但是OpenCV和OpenGL之间也有坐标系的差异。我如何在OpenGL坐标系中获得度数的旋转矢量?