我正在实现一种算法,需要我在循环的每次迭代中从向量中移除和添加相同的元素。
示例:
迭代1:| 1 2 3 4 | (4号)
迭代2:| 1 3 | 2 4(大小2与元素' 2'和' 4'仍然存在于内存中,但未考虑向量的大小)
迭代3:| 1 2 3 | 4(大小3与元素' 4'仍在那里)
基本上,我希望能够更改size()函数返回的值,而不会出于性能原因影响向量。
我知道我可以在我的向量之外使用另一个变量来跟踪它的大小,但我想知道它是否可以直接在std :: vector容器内部。
感谢您的帮助。
答案 0 :(得分:7)
您想要的内容与vector
的工作方式在逻辑上不一致。 size
返回T
中vector
类型的对象数。通过减小尺寸,任何从末端切断的物体都会被破坏。增加大小时,您将添加新对象。
最好在 vector
周围构建一个具有所需行为的类型。
答案 1 :(得分:3)
你做不到。
降低size()
报告的值的唯一方法是调整大小。当调整大小减小大小时,就程序而言,新大小之外的元素不再存在。任何访问它们的方法(或者在你的情况下重新访问它们)都会产生不确定的行为。
如果要跟踪正在使用的数组的元素数(例如,您使用的是带有五个元素的向量的两个元素),则创建一个额外的变量来跟踪它。为了说明(希望)明显,该变量需要与向量的大小保持一致(例如,以避免跟踪在具有五个元素的向量中使用十个元素)。
如果要将变量与向量保持一致,请同时使用struct
/ class
类型的成员。该类可以提供管理向量和“使用中”元素数量的成员函数或操作,以确保一致性。
答案 2 :(得分:3)
我不知道,也许使用has-a
代替is-a
?
template <typename T> class subvector {
protected:
std::vector<T> owner_;
std::size_t begin_;
std::size_t end_;
public:
subvector(std::vector<T>& owner, size_t from, size_t to) :
owner_(owner), begin_(from), end_(to)
{
// do some range checks
}
size_t size() const {
// range check before return
// either throw (fast-fail) *or*
// adjust the out-of-range ends (lenient but maybe unsafe)
return end_-begin_+1;
}
// implement as many of the std::vector methods/operators
// you are likely to need in your code by delegation
// to the owner_.
// Stay minimal, whenever you use something you don't have,
// the compiler will tell you.
};