如何安全地引用std::vector元素
How I can safely reference to an std::vector element?
我想创建一个结构,为其他结构保持更高的状态。
我试着这样创建它,但我最近发现,返回一个指向std::vector元素的指针是不安全的,因为该指针可能会更改。
struct Foo {
std::string &context;
std::string content;
Foo(std::string &context, std::string content) : context(context), content(content) {}
}
struct Bar {
std::string context;
std::vector<std::string> manyFoos;
Foo* addFoo(std::string content) {
manyFoos.emplace_back(context, content);
return &manyFoos[manyFoos.size() - 1];
}
}
struct Example {
Bar bar;
Foo* fooA;
Foo* fooB;
Example() {
fooA = bar.addFoo("Hello");
fooB = bar.addFoo("World");
}
}
做这件事有什么好的、安全的方法?
有什么好的、安全的方法可以做到这一点?
保存耦合(向量引用,Foo
的索引(,假设Foo
只添加在后面。
加一点合成糖:
struct Bar {
std::string context;
std::vector<Foo> manyFoos;
struct FooProxy
{
std::vector<Foo>& foos;
std::vector<Foo>::size_type index;
operator Foo() { return foos[index]; }
};
auto addFoo(std::string content) {
manyFoos.emplace_back(context, content);
return FooProxy{manyFoos, manyFoos.size()-1};
}
};
实例
您可以拥有shared_ptr的向量&返回weak_ptr,这样可以确保正确引用
#include <iostream>
#include <vector>
#include <memory>
struct Foo {
std::string &context;
std::string content;
Foo(std::string &context, std::string content) : context(context), content(content) {}
};
struct Bar {
std::string context;
std::vector<std::shared_ptr<Foo>> manyFoos;
std::weak_ptr<Foo> addFoo(std::string content) {
auto foo = std::make_shared<Foo>(context, content);
manyFoos.emplace_back(foo);
return foo;
}
};
void printFoo(std::weak_ptr<Foo> foo)
{
// Here we are checking weak_ptr expiry
std::cout << (foo.expired() ? "Foo Expired" : foo.lock()->content) << std::endl;
}
int main() {
Bar bar;
std::weak_ptr<Foo> fooA;
std::weak_ptr<Foo> fooB;
fooA = bar.addFoo("Hello");
fooB = bar.addFoo("World");
printFoo(fooA);
printFoo(fooB);
// erase last element
bar.manyFoos.pop_back();
printFoo(fooB);
return 0;
}
输出:
Hello
World
Foo Expired
相关文章:
- 为什么可以将左值传递给"std::async",即使它引用了右值
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 未定义的引用,尽管存在符号,但 std::experimental::可选
- std::iterator::reference 必须是引用吗?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- std::unordered_map::提取引用/指针失效
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 修改在 std::future 的 lambda 中引用捕获的值
- 更改其类型后,丢失对 std::variant 对象的引用
- 引用 std::any 或 not_yet_in_std::whatever 的惯用方式是什么?
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 在 C++20 之前,在带有常量或引用字段的"A"上调用 'std::vector<A>
- 引用 std::shared:ptr 以避免引用计数
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- std::is_class 在引用类上为 false
- 通过引用传递向量是请求 std::分配器
- 非默认可构造和 std::引用包装器替代项的序列化
- std::引用类型的可选专用化