Col*_*len 328 c++ stl reference vector container-data-type
当我这样做:
std::vector<int> hello;
Run Code Online (Sandbox Code Playgroud)
一切都很好.但是,当我把它作为引用的向量时:
std::vector<int &> hello;
Run Code Online (Sandbox Code Playgroud)
我得到了可怕的错误
错误C2528:'指针':指向引用的指针是非法的
我想把一堆结构的引用放到一个向量中,这样我就不必插入指针了.为什么矢量会对此发脾气?我唯一的选择是使用指针向量吗?
new*_*cct 315
像矢量这样的容器的组件类型必须是可分配的.引用不可分配(您只能在声明它们时初始化它们,并且以后不能让它们引用其他内容).其他不可分配类型也不允许作为容器的组件,例如vector<const int>不允许.
Ion*_*rel 111
是的,您可以,寻找std::reference_wrapper,模仿参考但可分配,也可以"重新安排"
Jam*_*ran 30
就其本质而言,引用只能在创建时设置; 即,以下两行具有非常不同的效果:
int & A = B; // makes A an alias for B
A = C; // assigns value of C to B.
Run Code Online (Sandbox Code Playgroud)
此外,这是非法的:
int & D; // must be set to a int variable.
Run Code Online (Sandbox Code Playgroud)
但是,在创建矢量时,无法在创建时为其项目指定值.你基本上只是制作了最后一个例子.
Ste*_*hen 27
Ion Todirel已经提到了答案YES使用std::reference_wrapper.从C++ 11开始,我们就有了一种从中检索对象的机制,std::vector 并通过使用来删除引用std::remove_reference.下面给出了使用g++和clang使用选项编译
-std=c++11并成功执行的示例.
#include <iostream>
#include <vector>
#include<functional>
class MyClass {
public:
void func() {
std::cout << "I am func \n";
}
MyClass(int y) : x(y) {}
int getval()
{
return x;
}
private:
int x;
};
int main() {
std::vector<std::reference_wrapper<MyClass>> vec;
MyClass obj1(2);
MyClass obj2(3);
MyClass& obj_ref1 = std::ref(obj1);
MyClass& obj_ref2 = obj2;
vec.push_back(obj_ref1);
vec.push_back(obj_ref2);
for (auto obj3 : vec)
{
std::remove_reference<MyClass&>::type(obj3).func();
std::cout << std::remove_reference<MyClass&>::type(obj3).getval() << "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
Dre*_*ann 14
编辑:是一个使用的建议std::vector< boost::ref<int> >,这将无法工作,因为你不能默认构建一个boost::ref.
Ada*_*eld 12
这是C++语言的一个缺陷.您不能获取引用的地址,因为尝试这样做会导致引用对象的地址,因此您永远无法获得指向引用的指针. std::vector使用指向其元素的指针,因此需要能够指向存储的值.你将不得不使用指针.
std::reference_wrapper像这样使用:
#include <functional>
#include <string>
#include <vector>
#include <iostream>
int main()
{
std::string hello = "Hello, ";
std::string world = "everyone!";
typedef std::vector<std::reference_wrapper<std::string>> vec_t;
vec_t vec = {hello, world};
vec[1].get() = "world!";
std::cout << hello << world << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
作为标准建议,对于X包含类型对象的标准容器T,T必须Erasable来自X。
Erasable 表示以下表达式格式正确:
allocator_traits<A>::destroy(m, p)
Run Code Online (Sandbox Code Playgroud)
A是容器的分配器类型,m是分配器实例,并且p是type的指针*T。见这里的Erasable定义。
默认情况下,std::allocator<T>用作向量的分配器。对于默认分配器,要求等同于的有效性p->~T()(请注意,T它是引用类型,并且p是指向引用的指针)。但是,指向引用的指针是非法的,因此该表达式的格式不正确。
| 归档时间: |
|
| 查看次数: |
161555 次 |
| 最近记录: |