C ++ не может вернуть векторный шаблон - PullRequest
1 голос
/ 02 апреля 2012

Я пытаюсь написать функцию, которая преобразует общий список в вектор, однако я не могу заставить свою функцию компилироваться. Вот мой код (который находится в файле .h):

template <class T>
inline std::vector<T> list2vector(std::list<T> &l)
{
  std::vector<T> v;
  v.insert(v.begin(),l.begin(),l.end());
  return v;
}

Кто-нибудь может указать, что мне здесь не хватает? Ошибка компилятора следующая:

find_rpeat.cpp:85: error: invalid initialization of non-const reference of type
?std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&?
from a temporary of type
?std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >?

Ответы [ 4 ]

3 голосов
/ 02 апреля 2012
std::vector<T> v;
std::copy(l.begin(),l.end(), std::back_inserter(v));
1 голос
/ 02 апреля 2012

Исходя из ваших комментариев, ваш код выглядит примерно так, и он должен скомпилироваться:

#include <iostream>
#include <vector>
#include <list>
using namespace std;

template <class T>
inline std::vector<T> list2vector(std::list<T> &l)
{
  std::vector<T> v;
  v.insert(v.begin(),l.begin(),l.end());
  return v;
}

int main() {
   list<string> mylist;
   vector<string> myvector = list2vector(mylist); 
   return 0;
}

Но для того, чтобы выдать ваше сообщение об ошибке, должно быть что-то вроде: vector<string>& myvector = list2vector(mylist); (назначить временный объектнеконстантная ссылка)

0 голосов
/ 02 апреля 2012

Кажется, вы можете создать и заполнить вектор одной строкой

std::vector<T> v (l.begin(), l.end());

А в C ++ 11 это можно сделать еще короче

template <class T>
inline std::vector<T> list2vector(std::list<T> &l)
{
  return {l.begin(), l.end()};
}
0 голосов
/ 02 апреля 2012

В STL уже есть универсальная функция преобразования. Попробуйте

std::transform(l.begin(), l.end(), std::back_inserter(v), Fn);

Я не вижу смысла писать list2vector или что-то еще, если вы можете сделать это с помощью STL. Думайте об этом как о сопоставлении между двумя «общими» наборами. В вашем случае между списком и вектором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...