1

我想将整个集合作为参数传递给函数,就像我们对数组所做的那样(即 &array[0])。我无法弄清楚如何获取指向一组原始数据的指针。

4

4 回答 4

4

不可能以与数组相同的方式执行此操作,因为std::set不需要将其数据排列在连续的内存块中。它是一棵二叉树,因此它很可能由链接节点组成。但是你可以通过引用传递它,或者使用begin()andend()迭代器。

template <typename T>
void foo(const std::set<T>& s);

template <typename Iterator>
void bar(Iterator first, Iterator last);

std::set<int> mySet = ....;
foo(mySet);
bar(mySet.begin(), mySet.end());
于 2012-08-27T06:16:40.247 回答
2

您无法像获取数组一样获取指向原始数据的指针,因为 aset不驻留在连续内存中。

我想将整个集合作为参数传递给函数

通过引用传递它。没有内存开销(如果这是您担心的):

void foo(std::set<int>& x);
于 2012-08-27T06:16:56.013 回答
1

您将不得不遍历std::set以提取std::set.
std::vector数组不同,标准没有要求std::set元素应位于连续内存中。

在函数中传递一个引用/指针,std::set并通过迭代它来提取函数内部的数据。

于 2012-08-27T06:16:46.520 回答
0

这取决于你的意思:

“我想将整个集合作为参数传递给函数”

std::set<int>  data;
// fill data;

您可以通过引用传递集合:

plop(data);   // void plop(std::set<int>& data); // passing be reference would be the C++ way

或者,您可以传递迭代器。
这会抽象出您正在使用的容器类型,从而允许 plop() 的编写者专注于算法。在这种情况下,迭代器的行为方式与指针相同(在 C++ 代码中)。

plop(data.begin(), data.end(); // template<typename I> void plop(I begin, I end);

或者,您的意思是要将数据集中传递给类似 C 的函数。
在这种情况下,您需要传递一个指针(因为这是 C 唯一能理解的)。不幸的是,您不能将指针直接传递到集合中,因为这没有真正的意义。但是您可以将数据复制到向量中,然后从那里复制到 C 程序中:

std::vector<int>  datavec(data.begin(), data.end());
plop(&data[0], datavec.size());   // void plop(int* data, std::size_t size);

这是有效的,因为向量将数据存储在连续的内存中。

于 2012-08-27T06:37:03.740 回答