【问题标题】:How to create a vector of a type of variable?如何创建一个变量类型的向量?
【发布时间】:2016-02-15 01:43:40
【问题描述】:

所以我有一个模板函数(?不确定它被称为那个。以“模板”开头并且是一个函数)向量,我想保存一些数据。问题是——数据可能由整数组成,可能由浮点数组成,可能由其他向量组成——我只有一个指向该类型变量的迭代器。我可以为该类型创建一个向量吗?就像是 “std::vector”之类的?

UPD。

template<class InputIterator, class UnaryPredicate>
void partial_sort (InputIterator first, InputIterator last, UnaryPredicate pred){
    std::vector<????> to_sort;

我需要向量“to_sort”来保存被排序的向量所保存的数据,但我所拥有的只是指向第一个和最后一个元素的迭代器。

【问题讨论】:

  • std::vector 并没有真正的帮助。通过模板参数,向量可以是 ONE 类型,例如诠释。另一种可能性是创建一个 void* 列表并将它们转换为真实类型,但这很难看。也许您应该考虑存储可以处理问题域要求的自定义数据类型
  • 可以添加你的功能码吗?
  • 您能否显示模板函数的签名,即template 部分和所有参数的列表,直到左括号?如果您将未知类型的迭代器作为参数,请同时显示该迭代器。
  • 一些代码会有所帮助。您可以使用std::iterator_traits&lt;It&gt;::value_type 获取迭代器指向的值的类型。因此,您可以通过std::vector&lt;typename std::iterator_traits&lt;It&gt;::value_type&gt; vec; 定义您的向量,It 是您的迭代器的类型。
  • @anhoppe 我不认为 OP 想在同一个向量中混合不同类型的项目;我认为他不知道创建模板捕获的类型的向量的语法。

标签: c++ templates vector iterator


【解决方案1】:
template <class It>
void myFunction (It b, It e) {
   auto vec = std::vector<typename std::iterator_traits<It>::value_type> { b, e };
   // now vec is filled with copies of the values between b and e
}

【讨论】:

  • 你为什么用auto而不是std::vector&lt;typename std::iterator_traits&lt;It&gt;::value_type&gt; vec{ b, e }
  • @HolyBlackCat 编译器自动推断返回类型。
  • @mnciitbhu 请再看看我的代码。他使用了auto var = T(params);,而不是更明显的T var(params);
  • @HolyBlackCat 对不起,我误解了。为您的问题 +1。
【解决方案2】:

使用

std::vector<typename std::iterator_traits<InputIterator>::value_type> to_sort(first, last);
// to_sort will be having all values between [first, last)

typedef typename std::iterator_traits<InputIterator>::value_type _value_type;
std::vector<_value_type> to_sort(first, last);
// to_sort will be having all values between [first, last)

【讨论】:

    【解决方案3】:

    使用 c++14 你可以使用

    typedef std::remove_reference<decltype(*first)>::type ValueType;
    std::vector<ValueType> vec;
    

    【讨论】:

    • 同样从 C++ 14 你可以使用std::remove_reference_t&lt;decltype(*first)&gt; 而不是std::remove_reference&lt;decltype(*first)&gt;::type
    猜你喜欢
    • 2018-11-27
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多