【发布时间】:2017-12-13 11:23:06
【问题描述】:
我正在寻找一个 C++ 容器来存储指向同时满足以下要求的对象的指针。
- 保持元素顺序的容器(序列容器,所以
std::set不适合) - 具有返回实际大小的成员函数的容器(
std::array::size()总是返回固定大小,std::array不适合) - 支持随机访问的容器,例如
operator []。
这是我的代码 sn-p,我想删除用于检查元素大小和唯一性的断言。
#include <vector>
#include <set>
#include "assert.h"
class Foo {
public:
void DoSomething() {
}
};
int main() {
// a variable used to check whether a container is properly assigned
const uint8_t size_ = 2;
Foo foo1;
Foo foo2;
// Needs a kind of sequential containers to keep the order
// used std::vector instead of std::array to use member function size()
const std::vector<Foo*> vec = {
&foo1,
&foo2
};
std::set<Foo*> set_(vec.begin(), vec.end());
assert(vec.size() == size_); // size checking against pre-defined value
assert(vec.size() == set_.size()); // check for elements uniqueness
// Needs to access elements using [] operator
for (auto i = 0; i < size_; i++) {
vec[i]->DoSomething();
}
return 0;
}
是否有一个 C++ 容器不需要在我的代码 sn-p 中使用两个断言?或者我是否需要创建自己的类来封装其中一个 STL 容器?
【问题讨论】:
-
为什么不使用 std::vector?
-
我还建议您花一些时间阅读about the XY problem,并思考这个问题可能是一个问题,以及如何改进它。
-
啊,我猜是条目的唯一性是问题?不幸的是,那只是在标题中,所以很容易错过。使用散列来管理唯一性,同时使用向量来管理索引。将其全部包装在一个对象中,该对象公开 set insert 方法,但其他所有内容为向量。可能从向量派生得到曝光。
-
@Someprogrammerdude 据我所知,std::unordered_set 以任意顺序存储元素,我想要一个可以指定顺序的元素。
-
看起来你想要的是包含一个向量的东西,带有
push_back、[] operator和你需要的任何其他东西——它自己执行唯一检查;或者包装一个集合,然后自己执行随机访问操作
标签: c++ c++11 stl containers