C++ extend a vector with another vector
我是C/C++领域的C/Python程序员,第一次与STL一起工作。
在python中,用另一个列表扩展列表使用
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); |
我需要两个不同的
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(); } } |
使用
1 2 | A.reserve(A.size() + B.size()); A.insert(A.end(), B.begin(), B.end()); |
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()); A.insert(A.end(), B.begin(), B.end());</textarea> |