C++中的不可变列表
Immutable list in C++
如何在cpp中制作不可变列表? 列表的引用和数据一样应该是常量。
我不会在向量或任何其他容器上制作包装类(我知道该方法类似于本文(。
使用constexpr
或const pointers
执行此操作的最佳方法是什么。
只需将其声明为const
,如下所示:
const std::list<int> constList = { 1, 2, 3 };
像constList.begin();
这样的方法将返回一个const_iterator
,像constList.push_back(3);
这样的调用将不会编译。
将其地址分配给非常量指针将不起作用:
std::list<int> *l = &constList; // does not compile
将引用传递给采用非 const 引用的函数不起作用:
void a(std::list<int> &list) {}
int main()
{
const std::list<int> mylist = { 1, 2, 3 };
a(mylist); // does not compile
}
不修改列表不是解决方案。
创建一个非常量列表,一旦你完成了构建它,就把它移动到一个const
列表中:
std::list<int> mylist = { 1, 2, 3 };
mylist.push_back(4);
const std::list<int> constList = std::move(mylist);
您可以简单地将其用作const std::list<T>
。 以下代码中的两个指针将打印出相同的值。
#include <iostream>
#include <list>
using T = double;
void some_function(const std::list<T>& list) {
const double * ptr = &(*list.begin());
std::cout << ptr << "n";
//list.push_back(3.0);//error list is const
}
int main() {
std::list<T> list{3.4,-42};
const std::list<T>& const_list = list;
const double * ptr = &(*const_list.begin());
std::cout << ptr << "n";
//const_list.push_back(3.0);//error list is const
some_function(list);
}
不存在不可变列表..如果你想使任何列表不可变,那就去做吧 -> "创建一个名为 class what 的包装器,并在包装器类中创建 stl list 的对象,并且在 what 类中不提供任何函数并使用 what 的对象玩游戏......" 现在您的列表是不可变的。
相关文章:
- 正在寻找C++不可变的hashset/hashmap
- 具有常量属性的不可变类
- 为什么将函数传递给内核会导致数据变得不可变?
- (C++) 字符串文本与参数列表不匹配
- 现代c++编译器会优化不可变的临时变量吗
- C++中的不可变列表
- 如何将地图作为不可变地图传递?
- 不可变的全局对象应该声明为"const my_result_t BLAH"还是"extern const my_result_t BLAH;"?
- 向不可变纹理存储提供数据
- 在C++中创建不可变且高效的类的惯用方法
- std::shared_ptr<std::string const> 可以作为引用计数的不可变字符串的有效实现吗?
- 编写接受可变跨度作为不可变跨度的模板函数
- 可变存储与不可变存储
- 不可变数据模型的内存管理
- 编译模板函数时形式参数列表不匹配
- 作为参数的空初始值设定项列表不调用默认构造函数
- std::仅移动类型列表:不能在 VC++ 中放入 std::vector
- 在C++中创建不可变对象的更好方法
- 使用.txt文件填充 STL 列表不起作用
- 合并两个排序的列表 - 不起作用