相关疑难解决方法(0)

621
推荐指数
17
解决办法
33万
查看次数

您使用哪些C++标准库包装函数?

今天早上问的这个问题让我想知道你认为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)

我还有一些,但我对你使用的是哪些感兴趣?请限制包装函数的答案- 即不超过几行代码.

c++

81
推荐指数
12
解决办法
9584
查看次数

将矢量追加到矢量的最佳方法

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)

c++ vector append std c++11

43
推荐指数
2
解决办法
5万
查看次数

将std :: vector附加到自身,未定义的行为?

这个问题使我不确定将一个向量附加到自身.所以问题是:遵循代码行做我所期望的,但它是否符合标准?

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++ vector language-lawyer

14
推荐指数
1
解决办法
1052
查看次数

C++链接列表行为

我有一些C代码,其中有两个链表(比如A和B),A在特定位置插入B,A仍然有元素.

如何使用C++ STL有效地模拟相同的行为?如果我尝试拼接,它会使第二个空.

谢谢,Gokul.

c++ stl linked-list stdlist

5
推荐指数
2
解决办法
486
查看次数

插入到底是等同于std :: copy()吗?

考虑以下两种方法将元素附加到向量中

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是一个成员函数,可能insertstd::copy它做得更好或者做同样的事情吗?

我可以自己测试,但我必须为每个模板类型的每个向量执行此操作.有人做过吗?

c++ stl-algorithm

3
推荐指数
1
解决办法
6031
查看次数

在另一个的末尾添加一个向量

有没有一种方法可以在另一个向量的末尾添加一个向量?例如,如果我的向量是

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

c++ vector

2
推荐指数
1
解决办法
1190
查看次数

在没有继承的情况下向c ++类添加功能

我需要一个缓冲类.我发现"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++

1
推荐指数
1
解决办法
400
查看次数

C++:有一个'无限'的容器,带有'add all'方法吗?

可能重复:
C++:将向量附加到向量

我正在寻找无限容器(我只要有足够的空间就可以在运行时添加元素),例如'vector'或'linked list',它有一个接受另一个容器和副本的方法它的元素.

有这样的事吗?

c++ containers

0
推荐指数
1
解决办法
574
查看次数