如何获取指向原始数据的std::set指针
How to get std::set pointer to the raw data?
我想把整个集合作为参数传递给函数,就像我们对数组(即&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);
这是因为矢量将数据存储在连续内存中。
相关文章:
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 修改"std::set"中用户定义类型的值
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 我从 std::set 得到const_iterator而不是迭代器
- 为什么 std:set(带有单个冒号)可以编译?
- 遍历 std::set 中包含的所有三重不同值?
- 插入 std::set 作为 std::map 的键
- 如何在 c++ 中使用默认值将 std::set 转换为 std::map
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- 如何从 std::set 绘制 n 个元素的样本
- 为什么 std::set 容器使用的内存比其数据大小多得多?