C++中的不可变列表

Immutable list in C++

本文关键字:列表 不可变 C++      更新时间:2023-10-16

如何在cpp中制作不可变列表? 列表的引用数据一样应该是常量。

我不会在向量或任何其他容器上制作包装类(我知道该方法类似于本文(。

使用constexprconst 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 的对象玩游戏......" 现在您的列表是不可变的。