Неизменный список в C ++ - PullRequest
0 голосов
/ 21 октября 2019

Как сделать неизменный список в cpp? ссылка списка должна быть постоянной, а также это данные .

Я не делаю класс-оболочку для вектора или любого другого контейнера (я знаю этот методаналогично этой статье ).

Каков наилучший способ сделать это, используя constexpr или const pointers.

Ответы [ 2 ]

7 голосов
/ 21 октября 2019

Просто объявите его как 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

Передача ссылки на функцию, которая принимает неконстантную ссылку, не работает:

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);
1 голос
/ 21 октября 2019

Вы можете просто использовать его как 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);
}
...