我发现自己经常做这样的事情来连接从函数返回的几个向量(可能是类函数):
#include <vector>
#include <iostream>
using namespace std;
vector<int> v1;
const vector<int>& F1() {
cout << "F1 was called" << endl;
/*Populate v1, which may be an expensive operation*/
return v1;
}
int main() {
vector<int> Concat;
Concat.insert(Concat.end(), F1().begin(), F1().end());
/*Do something with Concat*/
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如我所料,F1()被调用两次,如果它是一个昂贵的函数调用,这可能是不可取的.另一种方法是将返回值复制F1()到一个临时向量中,该向量只需要一个函数调用,但是如果向量很大则会产生复制操作,这可能是不合需要的.我能想到的唯一另一种选择是创建一个指向临时向量的指针,并为其分配返回值,F1()如下所示:
int main() {
vector<int> Concat;
const vector<int>* temp = &F1();
Concat.insert(Concat.end(), temp->begin(), temp->end());
/*Do something with Concat*/
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这真的是最好的解决方案吗?使用临时变量似乎很麻烦,特别是如果我需要连接几个向量.我也觉得应该有一种方法来使用引用而不是指针来做到这一点.有什么建议?
最好的解决方案不是vector直接使用,而是首先使用OutputIterators和std::back_inserter.
template <typename OutputIterator>
OutputIterator F1( OutputIterator out )
{
cout << "F1 was called" << endl;
/* Insert stuff via *out++ = ...; */
*out++ = 7;
return out;
}
int main()
{
std::vector<int> Concat;
// perhaps reserve some moderate amount of storage to avoid reallocation
F1( std::back_inserter(Concat) );
F1( std::back_inserter(Concat) );
}
Run Code Online (Sandbox Code Playgroud)
演示.这样就实现了最大的效率和灵活性.
| 归档时间: |
|
| 查看次数: |
717 次 |
| 最近记录: |