【问题标题】:C++ unable to return a vector templateC++ 无法返回矢量模板
【发布时间】:2012-04-15 20:53:50
【问题描述】:

我正在尝试编写一个将通用列表转换为向量的函数,但是,我无法编译我的函数。这是我的代码(位于 .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> > > >?

【问题讨论】:

  • 函数签名中可能需要const std::list&lt;T&gt;
  • 这段代码为我编译http://ideone.com/p3CEt
  • 能否贴出调用函数编译失败的代码?
  • 请注意,有一个 vector 构造函数接受一个范围:std::vector&lt;T&gt;(l.begin(), l.end());
  • @user788171:你能发布调用函数吗?看起来 mylistconst std::list&lt;string&gt;&amp; 或者您尝试调用它的函数是 const 函数。

标签: c++ list templates vector


【解决方案1】:

我似乎可以在一行中创建和填充矢量

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()};
}

【讨论】:

    【解决方案2】:
    std::vector<T> v;
    std::copy(l.begin(),l.end(), std::back_inserter(v));
    

    【讨论】:

      【解决方案3】:

      根据您的 cmets,您的代码是这样的,它应该可以编译:

      #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&lt;string&gt;&amp; myvector = list2vector(mylist);(将临时对象分配给非常量引用)

      【讨论】:

        【解决方案4】:

        STL 中已经为您提供了通用的转换功能。试试看

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

        如果您可以使用 STL 来编写 list2vector 或其他内容,我看不出有任何理由。把它想象成两个“通用”集合之间的映射。在您的情况下,列表和向量之间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-16
          • 2013-05-18
          • 1970-01-01
          • 2016-06-12
          • 2013-03-29
          • 1970-01-01
          • 2022-01-26
          相关资源
          最近更新 更多