1

我是 C++ 新手。我只想声明一个数组并找到它的大小。我该怎么做呢?我不断得到字符数或其他东西。

string vidArray[] = {"fingers.mov","motion_test.mov"};
int numVids = vidArray->size();
4

5 回答 5

4

只需使用

vector<string> s{"s1", "s2", "s3"};

用于初始化“数组”。

那么你可以使用

s.size()

获取向量的大小。

于 2012-09-19T17:42:25.553 回答
2

首先,您进行的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();
于 2012-09-19T17:38:51.923 回答
1

数组在传递时衰减为指向其第一个元素的指针。这也发生在你的情况下 - 你得到string*并且你实际上调用了字符串的成员函数size()。它返回它持有的字符数。

要执行您想要的操作,请将数组的总大小除以单个元素的大小:

int numVids = sizeof(vidArray) / sizeof(string);
于 2012-09-19T17:33:28.517 回答
0

在 C++ 中,数组不是对象。他们没有像 size() 这样的方法。您调用的是数组中第一个字符串的 size() 方法,因为数组的内存地址也是其第一个条目的内存地址。

当您想要一个行为类似于数组的智能容器类时,您可以使用std::vector。它带有许多方便的功能,包括 size() 功能。

于 2012-09-19T17:27:18.137 回答
0

正如@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(),您不必担心手动内存管理。

于 2012-09-19T17:30:17.353 回答