偏移和传递矢量引用
Offset and pass vector reference
本文关键字:引用 更新时间:2023-10-16
当使用数组时,你可以这样做
class SomeClass
{
public:
int* LockMember( size_t& numInts );
private:
int* member;
size_t numInts;
};
int* SomeClass::LockMember( size_t& out_numInts )
{
out_numInts = numInts - 1;
return member + 1;
}
返回一个数组偏移量,以防止有人修改对象的部分附带内存,或者至少表明该对象的这部分附带内存应该保持不变。
由于我到处使用向量,我想知道是否有一些方法来完成相同的事情:
class SomeClass
{
public:
std::vector<int> LockMember( void );
private:
std::vector<int> member;
};
std::vector<int> SomeClass::LockMember( void )
{
// somehow make a vector with its beginning iterator pointing to member.begin() + 1
// have a size smaller by one, still the same end iterator. The vector must be
// pointing to the same data as in this class as it needs to be modifiable.
return magicOffsetVector;
}
注释部分替换为实际代码。什么好主意吗?
如果我理解正确的话:你想要一些内存分为两部分:一开始你想要一些不能被触摸的东西,然后你想要一些可以被客户端代码使用的东西。
您可以按照以下代码执行操作。这将为客户端代码提供一个副本。不过,这确实意味着你必须进行大量的复制。
class SomeClass
{
public:
std::vector<int> getMember( void ) const;
void setMember(std::vector<int> newContent);
private:
std::vector<int> member;
size_t magicOffset;
};
// Read restricted part
std::vector<int> SomeClass::getMember( void ) const
{
return vector<int>(member.begin() + magicOffset, member.end());
}
// Assign to restricted part
void SomeClass::setMember(const std::vector<int>& v)
{
std::copy(v.begin(), v.end(), member.begin() + magicOffset);
}
为了避免复制,可以为两个向量分配内存,一个用于受保护的部分,一个用于未受保护的部分,并使用placement new将两个向量放入该内存中,从而确保它们位于连续内存中。然后让客户端代码或多或少地自由访问vector的公共部分。然而,在vector
中仍然有记账变量的事情,基本上这将是一个可怕的黑客,只是等待爆炸。
但是,如果您只需要在每个元素的基础上访问不受限制的部分,则只需对参数进行范围检查,即:
int getElement(size_t idx)
{
idx += magicOffset;
if (idx > member.size() || idx < 0) throw std::out_of_range("Illegal index");
return member[idx];
}
然后提供setElement
,或者返回int&
。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何引用基类的派生类?