【问题标题】:Initializing multiple (unique) entries of a vector初始化向量的多个(唯一)条目
【发布时间】:2011-08-20 12:28:03
【问题描述】:

使用数组你可以这样做:

int a[] = { 1,2,3,4,5,6 }

你如何用矢量来做到这一点?

【问题讨论】:

  • 您目前不能将初始化列表与向量一起使用,但这是 C++0x 中的一个特性,据我所知,它尚未在编译器中实现。
  • @Shaktal:只要您使用--std=c++0x 启用它,它肯定在我的(相当旧的)版本的 GCC 中实现。但你是对的,它在 C++03 中无效。
  • @Mike Ahh,我不知道它是在 GCC 中实现的,尽管我知道它可能是目前最新的编译器(可能是由于它的开源性质)。感谢您清除它! :)

标签: c++ vector


【解决方案1】:

你可以这样写,虽然它不是初始化,但看起来很吸引人:

std::vector<int> v;
v << 1,2,3,4,5,6,7,8,9,10; //all pushed into the vector!

为了支持这种语法,您需要定义两个实用运算符:

template<typename T>
std::vector<T>& operator << (std::vector<T>& v, const T & item)
{
    v.push_back(item);  return v;
}
template<typename T>
std::vector<T>& operator,(std::vector<T>& v, const T & item)
{
    v.push_back(item);  return v;
}

你就完成了!

测试代码:

int main() {
       std::vector<int> v;
       v << 1,2,3,4,5,6,7,8,9,10;

       for ( size_t i = 0 ; i < v.size() ; ++i )
             std::cout << v[i] << " ";
}

输出:

1 2 3 4 5 6 7 8 9 10 

在线演示:http://www.ideone.com/1hyR3

使用实用程序运算符,您实际上可以避免临时变量,例如@Als 解决方案中的临时变量,并且您可以在没有boost 的情况下编写它!

【讨论】:

  • 看起来很不错,但仍不能与 size_t 或 double 一起使用(错误以 g++ (Debian 4.7.2-5) 4.7.2 上的 error: no match for ‘operator&lt;&lt;’ in ‘v &lt;&lt; 1’ 开头)
  • @hardmooth:如果您想允许不匹配(但可转换)的类型,请使用两个不同的模板参数。
  • 是的,你是对的。将其模板化为template&lt;typename S, typename T&gt; std::vector&lt;S&gt;&amp; operator &lt;&lt; (std::vector&lt;S&gt;&amp; v, const T &amp; item) 就可以了。谢谢!
【解决方案2】:

如果您使用的是 Boost,您可以简单地使用 Boost.Assign

std::vector<int> v = boost::assign::list_of(1)(2)(3)(4)(5)(6);

或者

如果你不使用 Boost,你可以分两步完成:

static const int a[] = {1,2,3,4,5,6};
vector<int> v (a, a + sizeof(a) / sizeof(a[0]) );

【讨论】:

    【解决方案3】:

    如果你不想使用 boost,你可以使用这个:

    std::vector<int> myvec;
    int myints[] = {1776, 7, 4};
    myvec.assign(myints, myints + 3);
    

    不完全相同,但非常接近。我一直用这个。

    【讨论】:

      【解决方案4】:

      从 C++ 11 开始,您可以使用列表初始化创建向量对象,如下所示:

      std::vector<int> v1 = {1, 2, 3, 4};
      std::vector<int> v2 {1, 2, 3, 4};
      

      在 C++ 17 中,您可以省略类型以允许 C++ 根据列表中传递的数据类型推断类型(前提是您不混合类型):

      // C++ 17
      std::vector v3 = {1, 2, 3, 4};
      std::vector v4 {1, 2, 3, 4};
      

      【讨论】:

      • 您是否缺少“;”在你的第一个代码块的第二行?
      猜你喜欢
      • 2017-07-26
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多