Как сделать указатель итератора?

По какой-то причине я не могу сделать итератор указателя. Это отключено? Я пытался сделать это, но это не работает …

#include <iostream>
#include <list>
#include <vector>
#include <string>

template<class T>
void convertListToVector(std::list<T> *listItem) {
typename std::list<T>::iterator it;
for (it = *listItem->begin(); it != *listItem->end(); it++)
std::cout << *it <<std::endl;
}

int main()
{
std::list<std::string> listExample;
listExample.push_back("2");
listExample.push_back("3");
listExample.push_back("5");
convertListToVector(&listExample);

return 0;
}

Ошибка:

error: no match for 'operator=' (operand types are 'std::list<std::basic_string<char> >::iterator {aka std::_List_iterator<std::basic_string<char> >}' and 'std::basic_string<char>')|
error: no match for 'operator!=' (operand types are 'std::list<std::basic_string<char> >::iterator {aka std::_List_iterator<std::basic_string<char> >}' and 'std::basic_string<char>')|

3

Решение

Вы можете просто использовать их как ссылки и упростить для себя …

#include <iostream>
#include <list>
#include <vector>
#include <string>

template<class T>
void convertListToVector(std::list<T> &listItem) {
typename std::list<T>::iterator it;
for (it = listItem.begin(); it != listItem.end(); it++)
std::cout << *it <<std::endl;
}

int main()
{
std::list<std::string> listExample;
listExample.push_back("2");
listExample.push_back("3");
listExample.push_back("5");
convertListToVector(listExample);

return 0;
}

Практическое правило

Используйте ссылки все время. Только указатели, когда вы иметь к. Вы можете спросить почему?

  1. Указатели, как правило, сбивают с толку программистов. Даже опытные.
  2. Указатели могут изменить то, на что они «указывают». Что может быть ужасно
    в некоторых случаях.
  3. Указатели могут быть нулевыми. Например:

В C ++ 11:

   int *p1 = nullptr;

Другой C ++:

   int *p1 = NULL;
int *p2 = 0;
  1. Ссылки должны ссылаться на объект. Это означает, что вы не можете просто поставить номер
    на «ссылку» Int

Лучшие практики

1: обратите внимание, что вы не можете изменить ссылки, на которые ссылаются, поэтому просто добавьте ключевое слово const перед вашими ссылками, чтобы они не меняли то, на что они указывают. Это лучшая практика, которая также гарантирует, что вы не совершите глупую ошибку, поскольку измените ссылки, на которые ссылаются ваши ссылки.

  const int x = 0;
const int &ref = x
2

Другие решения

Вам не нужно использовать operator* совсем, listItem->begin() вернет итератор.

for (it = listItem->begin(); it != listItem->end(); it++)
std::cout << *it <<std::endl;
}

Я пытаюсь ответить на ваш вопрос прямо, как сказал другой ответчик, вам не нужно пропускать listItem по указателю здесь, передача по ссылке должна быть достаточной.

3

По вопросам рекламы [email protected]