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

时间:2012-08-27 06:14:17

标签: c++ stl set

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

4 个答案:

答案 0 :(得分:4)

不可能以与数组相同的方式执行此操作,因为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());

答案 1 :(得分:2)

您无法获得与原始数据相同的指针,因为set不会驻留在连续内存中。

  

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

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

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

答案 2 :(得分:1)

您必须遍历std::set以提取std::set的所有元素。
std::vector和数组不同,std::set元素应该位于contiguos内存中的标准没有强制要求。

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

答案 3 :(得分: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);

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