今天早上问的这个问题让我想知道你认为C++标准库中缺少哪些功能,以及你如何用填充函数填补空白.例如,我自己的实用程序库具有此向量追加功能:
template <class T>
std::vector<T> & operator += ( std::vector<T> & v1,
const std::vector <T> & v2 ) {
v1.insert( v1.end(), v2.begin(), v2.end() );
return v1;
}
Run Code Online (Sandbox Code Playgroud)
这个用于清除(或多或少)任何类型 - 特别适用于像std :: stack这样的东西:
template <class C>
void Clear( C & c ) {
c = C();
}
Run Code Online (Sandbox Code Playgroud)
我还有一些,但我对你使用的是哪些感兴趣?请限制包装函数的答案- 即不超过几行代码.
std::vector<int> a;
std::vector<int> b;
std::vector<int> c;
Run Code Online (Sandbox Code Playgroud)
我想通过附加b's和c's元素来连接这三个向量a.哪种方法最好,为什么?
1)使用vector::insert:
a.reserve(a.size() + b.size() + c.size());
a.insert(a.end(), b.begin(), b.end());
a.insert(a.end(), c.begin(), c.end());
b.clear();
c.clear();
Run Code Online (Sandbox Code Playgroud)
2)使用std::copy:
a.reserve(a.size() + b.size() + c.size());
std::copy(b.begin(), b.end(), std::inserter(a, a.end()));
std::copy(c.begin(), c.end(), std::inserter(a, a.end()));
b.clear();
c.clear();
Run Code Online (Sandbox Code Playgroud)
3)使用std::move(from C++11):
a.reserve(a.size() + b.size() + c.size());
std::move(b.begin(), b.end(), std::inserter(a, a.end()));
std::move(c.begin(), c.end(), std::inserter(a, a.end()));
b.clear();
c.clear();
Run Code Online (Sandbox Code Playgroud) 这个问题使我不确定将一个向量附加到自身.所以问题是:遵循代码行做我所期望的,但它是否符合标准?
vec.reserve(vec.size() * 2):
vec.insert(vec.end(), vec.begin(), vec.end());
Run Code Online (Sandbox Code Playgroud)
以下(不reserve())仍然有效,是否符合标准?
vec.insert(vec.end(), vec.begin(), vec.end());
Run Code Online (Sandbox Code Playgroud)
还是实施依赖?
我有一些C代码,其中有两个链表(比如A和B),A在特定位置插入B,A仍然有元素.
如何使用C++ STL有效地模拟相同的行为?如果我尝试拼接,它会使第二个空.
谢谢,Gokul.
考虑以下两种方法将元素附加到向量中
std::vector<int> vi1(10,42), vi2;
vi2.insert(vi2.end(),vi1.begin(),vi1.end());
<OR>
std::copy(vi1.begin(),vi1.end(),std::back_inserter(vi2));
Run Code Online (Sandbox Code Playgroud)
std::copy版本看起来更干净,我不必输入vi2两次.但是因为它是一个通用的算法,而insert是一个成员函数,可能insert比std::copy它做得更好或者做同样的事情吗?
我可以自己测试,但我必须为每个模板类型的每个向量执行此操作.有人做过吗?
有没有一种方法可以在另一个向量的末尾添加一个向量?例如,如果我的向量是
std::vector<int> v1(3);
std::vector<int> v2(3);
/* ... initialize vectors ... */
/* ... for example, v1 is 1 2 3 and v2 is 4 5 6 ... */
Run Code Online (Sandbox Code Playgroud)
这是最聪明的方式添加v2到最后v1(即获得v1= 1 2 3 4 5 6)而不使用循环和push_back?
我需要一个缓冲类.我发现"std :: vector"非常有用,但我不喜欢这样做:
typedef std::vector<char> Buffer;
Buffer buff1;
Buffer buff2;
...
buff1.insert(buff1.end(), buff2.begin(), buff2.end())
Run Code Online (Sandbox Code Playgroud)
每次我想追加...我想有一些concat方法,如:
buff1.append(buff2)
Run Code Online (Sandbox Code Playgroud)
或者运营商+ =或者其他什么.
现在,我尝试添加此方法:
void append(dataStructures::Buffer& self, const dataStructures::Buffer& other)
{
self.insert(self.end(), other.begin(), other.end());
}
Run Code Online (Sandbox Code Playgroud)
并简单地通过以下方式调用它:buff1.append(buff2)但它不会编译,原因如下:std::vector<byte, std::allocator<byte>>" has no member "append".那是对的.我也尝试将"自我"作为指针,但没有成功.将operator <<添加到std :: ostream时它确实有效,所以我真的希望它能工作,但我错了.
当然,我可以使用继承机制创建一个Buffer,但是std容器没有虚拟Dtor,所以这可能是一个坏主意(虽然我没有添加任何成员变量......但仍然是一个坏主意).
有什么办法可以做我想要的吗?我知道这只是一个可读性问题,但对我来说很重要.我想知道是否有一个简单的解决方案,或者我唯一的选择是实现一个代理类或一个全新的Buffer类(我试过使用boost的Buffer,但它没有分配内存,就像我理解的那样多).
非常感谢你.
可能重复:
C++:将向量附加到向量
我正在寻找无限容器(我只要有足够的空间就可以在运行时添加元素),例如'vector'或'linked list',它有一个接受另一个容器和副本的方法它的元素.
有这样的事吗?
c++ ×9
vector ×4
stl ×2
append ×1
c++11 ×1
containers ×1
linked-list ×1
std ×1
stdlist ×1
stdvector ×1