c ++ - 声明一个字符串数组并查找其中的元素数(openFrameworks)

时间:2012-09-19 17:21:44

标签: c++ arrays size openframeworks

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

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

5 个答案:

答案 0 :(得分:4)

只需使用

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

用于初始化“数组”。

然后你可以使用

s.size()

获取向量的大小。

答案 1 :(得分:2)

首先,您所做的 vidArray-&gt; size()调用相当于 vidArray [0] .call(),因为数组只不过是一个数组指向第一个元素的指针,所以通过调用vidArray-&gt; size(),您只需执行:(* vidArray).size()。

这样的旧数组没有size(),但是有一些不可取的hacks基于宏来获取数组的计数:

#define COUNTOF(arr) (sizeof(arr) / sizeof(arr[0]))
COUNTOF(vidArray)

这将返回数组大小,但这不是一件好事(Explanations),这就是为什么我建议你使用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(Documentation

初始化这种方式
std::vector<std::string> vid;
vid += std::string("fingers.mov"),std::string("motion_test.mov");

或者一个boost :: array(Documentation)如果你想要一个大小不同的数组(即正如Walter在评论中所述,如果你已经在使用c ++ 11,你可以使用std: :数组,它是boost :: array但在标准库中)

boost::array<std::string,2> vid = {std::string("fingers.mov"),std::string("motion_test.mov")};

size_t vidSize = vid.size();

答案 2 :(得分:1)

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

要做你想做的事,把数组的总大小除以单个元素的大小:

int numVids = sizeof(vidArray) / sizeof(string);

答案 3 :(得分:0)

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

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

答案 4 :(得分: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(),您不必担心手动内存管理。 / p>