C++ 中的不可变列表
Immutable list in C++
如何在cpp中创建不可变列表?
列表的 reference 应该是常量,它的数据。
我不会在 vector 或任何其他容器上制作包装器 class(我知道类似于此 article 的方法)。
使用 constexpr
或 const pointers
执行此操作的最佳方法是什么。
只需声明为const
,像这样:
const std::list<int> constList = { 1, 2, 3 };
像 constList.begin();
这样的方法将 return 一个 const_iterator
而像 constList.push_back(3);
这样的调用将不会编译。
将其地址分配给非常量指针将不起作用:
std::list<int> *l = &constList; // does not compile
传递对采用非常量引用的函数的引用不起作用:
void a(std::list<int> &list) {}
int main()
{
const std::list<int> mylist = { 1, 2, 3 };
a(mylist); // does not compile
}
Not modifying the list is not a solution.
创建一个非常量列表,构建完成后,将其移至 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);
}
不存在不可变列表..如果你想让任何列表不可变,那就去吧 -> "Create a wrapper named class whatever and create object of stl list inside wrapper class and dont provide any function inside the whatever class and play game with whatever's object..."
现在你的列表是不可变的..
如何在cpp中创建不可变列表? 列表的 reference 应该是常量,它的数据。
我不会在 vector 或任何其他容器上制作包装器 class(我知道类似于此 article 的方法)。
使用 constexpr
或 const pointers
执行此操作的最佳方法是什么。
只需声明为const
,像这样:
const std::list<int> constList = { 1, 2, 3 };
像 constList.begin();
这样的方法将 return 一个 const_iterator
而像 constList.push_back(3);
这样的调用将不会编译。
将其地址分配给非常量指针将不起作用:
std::list<int> *l = &constList; // does not compile
传递对采用非常量引用的函数的引用不起作用:
void a(std::list<int> &list) {}
int main()
{
const std::list<int> mylist = { 1, 2, 3 };
a(mylist); // does not compile
}
Not modifying the list is not a solution.
创建一个非常量列表,构建完成后,将其移至 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);
}
不存在不可变列表..如果你想让任何列表不可变,那就去吧 -> "Create a wrapper named class whatever and create object of stl list inside wrapper class and dont provide any function inside the whatever class and play game with whatever's object..." 现在你的列表是不可变的..