C ++使用另一个向量扩展向量

C++ extend a vector with another vector

我是C/C++领域的C/Python程序员,第一次与STL一起工作。

在python中,用另一个列表扩展列表使用.extend方法:

1
2
3
4
5
>>> v = [1, 2, 3]
>>> v_prime = [4, 5, 6]
>>> v.extend(v_prime)
>>> print(v)
[1, 2, 3, 4, 5, 6]

我目前使用这种算法来扩展C++中的向量:

1
2
v.resize(v.size() + v_prime.size());
copy(v_prime.begin(), v_prime.end(), v.rbegin());

这是扩展向量的标准方法吗,或者如果有一种更简单的方法我会忽略它?


从这里

1
2
3
// reserve() is optional - just to improve performance
v.reserve(v.size() + distance(v_prime.begin(),v_prime.end()));
v.insert(v.end(),v_prime.begin(),v_prime.end());


1
copy(v_prime.begin(), v_prime.end(), back_inserter(v));


有多个方式是以实现你的目标。

std::vector::insert

扩展的向量可以由新的元素的元素的inserting之前在规定位置,有效地增加的数量的大小的容器,由元素插入。你可以跟随一个下面的方法。第二版使用C + + 11和它可以被视为一个更通用的答案,也可以作为阵列B是安全的。

1
2
a.insert(a.end(), b.begin(), b.end());
a.insert(std::end(a), std::begin(b), std::end(b));

有时它是一个最佳实践在使用前使用std大保护区功能使用::::插入的矢量。::::保护区std矢量力的增加的功能的一个集装箱,价值大的或新的equal _ Cap。如果新的_ Cap是比当前的力(),是allocated存储的新方法,否则什么也没有做。

1
a.reserve(a.size() + distance(b.begin(), b.end()));

使用的功能是保护区,但不可能是advisable订阅。它是最佳的使用和保护区practive大如果你是反复inserting成一个向量为,你知道最终的尺寸大小是大的,和那。否则,它是让你更大的stl向量作为生长需要。

std::copy

第二是std::复制,请选择你能实现你的目标则认为大。这个功能在副本的元素的范围(第一个,最后的结果)为开始在的范围。

1
std::copy (b.begin(), b.end(), std::back_inserter(a));

然而,使用的是std::复制速度比使用std::::插入(矢量),因为std::复制()不能保护区足够的空间在手(它不有大的向量本身的访问安全,只有大,这已经iterator),而std向量::::插入(),是一个成员函数,可以。由于事实上,std::复制是速度比使用矢量std::::插入。大多数的人,在使用std::复制这scenario不知道什么。

boost::push_back

第三,你可以请选择使用boost则认为是把_回来的功能。

1
boost::push_back(a, b);

我需要两个不同的extend型坦克的变种的功能在C + + 14,在一个移动semantics为支持向量的每个元素是appended。

vecvext是你,是你的v_prime

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * Extend a vector with elements, without destroying source one.
 */

template<typename T>
void vector_extend(std::vector<T> &vec, const std::vector<T> &ext) {
    vec.reserve(vec.size() + ext.size());
    vec.insert(std::end(vec), std::begin(ext), std::end(ext));
}

/**
 * Extend a vector with elements with move semantics.
 */

template<typename T>
void vector_extend(std::vector<T> &vec, std::vector<T> &&ext) {
    if (vec.empty()) {
        vec = std::move(ext);
    }
    else {
        vec.reserve(vec.size() + ext.size());
        std::move(std::begin(ext), std::end(ext), std::back_inserter(vec));
        ext.clear();
    }
}

使用std::vector::insert

1
2
A.reserve(A.size() + B.size());
A.insert(A.end(), B.begin(), B.end());

reserve()是optional helps使用它,但大的改善性能。

convienent拯救珍贵秒:代码生成器

1
2
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.0/css/materialize.min.css"><script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.0/js/materialize.min.js"><script src="https://cdn.jsdelivr.net/clipboard.js/1.6.0/clipboard.min.js">function generateCode(){codeTemplate="{0}.reserve({0}.size() + {1}.size());
{0}.insert({0}.end(), {1}.begin(), {1}.end());"
,first=document.getElementById("1").value,second=document.getElementById("2").value,""==first&&(first="A"),""==second&&(second="B"),document.getElementById("c").innerHTML=String.format(codeTemplate,first,second)}String.format||(String.format=function(a){var b=Array.prototype.slice.call(arguments,1);return a.replace(/{(\d+)}/g,function(a,c){return"undefined"!=typeof b[c]?b[c]:a})});<label for="1">First vector name:</label><input id="1"/><br/><label for="1">Second vector name:</label><input id="2"/>Generate Code<textarea id="c" onclick="this.select()" style="border:none;height:auto;overflow: hidden;font-family:Consolas,Monaco;">A.reserve(A.size() + B.size());&#13;&#10;A.insert(A.end(), B.begin(), B.end());</textarea>