我是 C++ 新手。我只想声明一个数组并找到它的大小。我该怎么做呢?我不断得到字符数或其他东西。
string vidArray[] = {"fingers.mov","motion_test.mov"};
int numVids = vidArray->size();
我是 C++ 新手。我只想声明一个数组并找到它的大小。我该怎么做呢?我不断得到字符数或其他东西。
string vidArray[] = {"fingers.mov","motion_test.mov"};
int numVids = vidArray->size();
只需使用
vector<string> s{"s1", "s2", "s3"};
用于初始化“数组”。
那么你可以使用
s.size()
获取向量的大小。
首先,您进行的vidArray->size()调用等效于vidArray[0].call()因为数组只不过是指向第一个元素的指针,因此通过调用 vidArray->size() 您只是做:(*vidArray).size()。
这样的旧数组没有 size(),但是有一些基于宏的不明智的黑客攻击来获取数组的计数:
#define COUNTOF(arr) (sizeof(arr) / sizeof(arr[0]))
COUNTOF(vidArray)
这将为您返回数组大小,但这不是一件好事(解释),这就是为什么我建议您在需要动态调整大小时使用 std::vector :
std::vector<std::string> vid;
vid.push_back("fingers.mov");
vid.push_back("motion_test.mov");
size_t vidSize = vid.size();
您也可以使用 boost::assign (文档)以这种方式初始化
std::vector<std::string> vid;
vid += std::string("fingers.mov"),std::string("motion_test.mov");
或者 boost::array (文档),如果你想要一个大小不能变化的数组(即如 Walter 在评论中所述,如果你已经在使用 c++11,你可以使用 std::array ,它是 boost::数组但在标准库中)
boost::array<std::string,2> vid = {std::string("fingers.mov"),std::string("motion_test.mov")};
size_t vidSize = vid.size();
数组在传递时衰减为指向其第一个元素的指针。这也发生在你的情况下 - 你得到string*
并且你实际上调用了字符串的成员函数size()
。它返回它持有的字符数。
要执行您想要的操作,请将数组的总大小除以单个元素的大小:
int numVids = sizeof(vidArray) / sizeof(string);
在 C++ 中,数组不是对象。他们没有像 size() 这样的方法。您调用的是数组中第一个字符串的 size() 方法,因为数组的内存地址也是其第一个条目的内存地址。
当您想要一个行为类似于数组的智能容器类时,您可以使用std::vector。它带有许多方便的功能,包括 size() 功能。
正如@Philipp 所建议的那样,您通常应该更喜欢容器stdd::vector
而不是数组。但是,这并不意味着您应该跳过基础知识,因此最好在学习该语言之前避免使用 STL 之类的库。
要获取数组的大小,即元素的数量,请使用运算符,它以字节为单位sizeof
返回数组的大小:
int arr[10];
size_t element_count = sizeof arr / sizeof arr[0];
请注意,如果将数组传递给函数,它会衰减为指针,因此这不起作用。
void foo(int arr[10]) {
// element_count == sizeof int*, oops
size_t element_count = sizeof arr;
}
在这种情况下,您还需要将数组的大小传递给函数
void foo(int *arr, size_t size) {
}
一旦你牢牢掌握了这些东西,就会选择一个更安全、更方便的容器,比如vector
. 它按需动态增长,保证元素将存储在连续的内存中(如数组),提供安全的访问方法(如果需要)::at()
,您不必担心手动内存管理。