如何获取指向原始数据的std::set指针

How to get std::set pointer to the raw data?

本文关键字:std set 指针 原始数据 何获 取指      更新时间:2023-10-16

我想把整个集合作为参数传递给函数,就像我们对数组(即&array[0])所做的那样。我不知道如何将指针指向集合的原始数据。

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

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());

不能像对数组那样获得指向原始数据的指针,因为set不存在于连续内存中。

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

通过引用传递。没有内存开销(如果你担心的是这一点的话):

void foo(std::set<int>& x);

您必须遍历std::set才能提取std::set的所有元素
std::vector和阵列不同,标准没有要求std::set元素应位于连续存储器中。

将引用/指针传递给函数中的std::set,并通过迭代来提取函数中的数据。

这取决于你的意思:

"我想把整个集合作为参数传递给一个函数"

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);

这是因为矢量将数据存储在连续内存中。