首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从两个向量的级联构造一个向量

从两个向量的级联构造一个向量
EN

Stack Overflow用户
提问于 2016-02-18 15:40:11
回答 6查看 3.1K关注 0票数 10

是否有一种方法可以将vector构造为2 vectors的连接(除了创建助手函数之外)?

例如:

代码语言:javascript
复制
const vector<int> first = {13};
const vector<int> second = {42};
const vector<int> concatenation = first + second;

我知道vector没有像string这样的加法运算符,但这正是我想要的行为。因此concatenation将包含: 13和42。

我知道我可以像这样初始化concatenation,但是它阻止了我创建concatenation const

代码语言:javascript
复制
vector<int> concatenation = first;
first.insert(concatenation.end(), second.cbegin(), second.cend()); 
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-02-18 15:59:07

不,如果你要求

  • 没有定义任何辅助函数,并且
  • 得到的向量可以声明为const
票数 9
EN

Stack Overflow用户

发布于 2016-02-18 15:55:54

代码语言:javascript
复制
template<typename T>
std::vector<T> operator+(const std::vector<T>& v1, const std::vector<T>& v2){
    std::vector<T> vr(std::begin(v1), std::end(v1));
    vr.insert(std::end(vr), std::begin(v2), std::end(v2));
    return vr;
}

这确实需要一个助手“函数”,但至少它允许您将其用作

代码语言:javascript
复制
const vector<int> concatenation = first + second;
票数 2
EN

Stack Overflow用户

发布于 2016-02-18 15:45:59

我觉得你得写个帮助函数。我会写成:

代码语言:javascript
复制
std::vector<int> concatenate(const std::vector<int>& lhs, const std::vector<int>& rhs)
{
    auto result = lhs;
    std::copy( rhs.begin(), rhs.end(), std::back_inserter(result) );
    return result;
}

它被称为:

代码语言:javascript
复制
    const auto concatenation = concatenate(first, second);

如果向量很可能很大(或者包含复制成本很高的元素),那么您可能需要先执行一个reserve来保存重新分配:

代码语言:javascript
复制
std::vector<int> concatenate(const std::vector<int>& lhs, const std::vector<int>& rhs)
{
    std::vector<int> result;
    result.reserve( lhs.size() + rhs.size() );
    std::copy( lhs.begin(), lhs.end(), std::back_inserter(result) );
    std::copy( rhs.begin(), rhs.end(), std::back_inserter(result) );
    return result;
}

(就我个人而言,只有当有证据表明这是一个瓶颈时,我才会费心)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35485866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档