std::vector的数组大小

4

我希望查询std::vector()数组中元素的数量或者size()大小。

我有一个如下所示的vector:

std::vector<int> vec[3];

vec.size()不能与上述向量声明一起使用。


3
你需要使用 std::distance(std::begin(vec), std::end(vec))。在 C++17 中,你需要使用 std::size(vec) - Kerrek SB
我认为他的意思是他想要 vec[0].size() + vec[1].size() + vec[2].size()。如果确实需要这样做,请注意上面的计算结果将与 vec[0].capacity() + vec[1].capacity() + vec[2].capacity() 不同。 - george_ptr
@kerrek。非常感谢,我已经声明了一个向量数组,我想要检查行数,也就是向量的数量。 - Agaz Wani
1
如果所有行的长度都相同,那么定义一个vec2D类会使性能更好,该类具有at(x,y)函数和一个私有线性向量。这意味着只需要一次分配而不是n次,而且缓存局部性更好。(当然,如果这只是一个快速练习-继续进行。) - Martin Bonner supports Monica
@MartinBonner。长度可能会有所不同。 - Agaz Wani
显示剩余4条评论
4个回答

11

为什么vec.size()不能工作呢?因为vec不是一个向量,而是一个数组(由向量组成),在C++中,数组不是对象(从OOP的角度来看,它们不是类的实例),因此没有成员函数。

如果你想要在执行vec.size()时获得结果3,那么你需要使用例如std::array

std::array<std::vector<int>, 3> vec;
std::cout << "vec.size() = " << vec.size() << '\n';  // Will output 3

或者如果你没有std::array,那么可以使用一个向量的向量,并通过调用正确的构造函数来设置大小:

std::vector<std::vector<int>> vec(3);
std::cout << "vec.size() = " << vec.size() << '\n';  // Will output 3

1
无论数组是用户定义类型还是其他类型,它们仍然是对象。 - Galik
在典型的面向对象编程中,数组不属于对象的范畴,其中你拥有类和对象(类的实例)。C++规范也将其他事物称为对象,包括数组,这可能有点令人困惑。 - Some programmer dude
谢谢您的回答。我需要在编译时还是运行时知道向量的大小,例如vec(3),以便通过命令行接受向量的大小。 - Agaz Wani
@AaghazHussain 你传递给构造函数的大小可以是在运行时设置的变量。或者你可以不指定大小,在以后的阶段调用例如resize,或者像往常一样推入一个新元素。 - Some programmer dude

2

std::vector<int> vec[3];并没有固有的规定第一次或第二次索引操作构成“行”还是“列”,这完全取决于程序员的个人观点。如果您认为它有3行,那么可以使用以下方法检索该数字...

 std::extent<decltype(vec)>::value

你需要包含#include <type_traits>才能进行操作。详情请查看这里

std::array<>专门设计用于提供更好、更一致的接口,与std::vector相似,已经广泛使用。

std::array<std::vector<int>, 3> vec;
...use vec.size()...

如果您希望模板代码能够同时处理向量和数组,则一致性尤为重要。


1

尝试

int Nrows = 3;
int Ncols = 4
std::vector<std::vector<int>> vec(Nrows);
for(int k=0;k<Nrows;k++)
   vec[k].resize(Ncols);

...

auto Nrows = vec.size();
auto Ncols = (Nrows > 0 ? vec[0].size() : 0);

0

可以使用 sizeof(vec[0])/sizeof(vec) 或者 sizeof(vec)/sizeof(vector<int>)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接