2012-08-12 88 views
3

例如,假设我想将值(1,2),(2,3),(3,4)等传递给一个函数,并让它返回一个数字列表,无论它们是什么,即在一些操作之后1,3,5,3,6。在C++中实现这个结果的最好方法是什么?从python移动之后,在这里执行它似乎要困难得多,有什么帮助吗?将元组传递给函数并返回数字列表的最佳方法?

+0

最好的答案可能取决于你到底在做什么。你需要将这些值作为元组传递吗?你可以将它们作为一个单独的矢量传递吗?你打算如何处理返回的值? – 2012-08-12 10:21:59

回答

2

我并不是说这是最好的方式,但我认为这是相当不错的,也从内存复制前瞻性,注意我避免返回vector(昂贵,因为它调用operator=隐):

#include <vector> 

using namespace std; 

/** 
* Meaningful example: takes a vector of tuples (pairs) values_in and returns in 
* values_out the second elements of the tuple whose first element is less than 5 
*/ 
void less_than_5(const vector<pair<int, int> >& values_in, vector<int>& values_out) { 
    // clean up the values_out 
    values_out.clear(); 

    // do something with values_in 
    for (vector<pair<int, int> >::iterator iter = values_in.begin(); iter != values_in.end(); ++iter) { 
     if (iter->first < 5) { 
      values_out.push_back(iter->second); 
     } 
    } 

    // clean up the values_out (again just to be consistent :)) 
    values_out.clear(); 

    // do something with values_in (equivalent loop) 
    for (int i = 0; i < values_in.size(); ++i) {   
     if (values_in[i].first < 5) { 
      values_out.push_back(values_in[i].second); 
     } 
    }   

    // at this point values_out contains all second elements from values_in tuples whose 
    // first is less than 5 
} 
+0

你能解释一下'vector > :: iterator iter = values_in.begin();'是否工作? – 2012-08-12 10:38:28

+0

这本身就是一个全新的问题:)但它在概念上很简单。每个集合都有一个迭代器(用于迭代该集合的元素),并且您可以访问集合的begin()和end()元素。为了得到迭代器类型,你可以简单地使用这种类型的特征,在这种情况下,'vector > :: iterator',但它适用于任何集合,例如'map > :: iterator' – 2012-08-12 10:43:01

+0

好吧,如果我理解正确,那么你实现for循环的方式是从vector中的第一对数字开始,最后一对结束数字?你为什么写iter!=而不是==?确切地说, – 2012-08-12 10:48:24

3

一般而言,您将使用std::vector容器及其方法push_back。然后你可以返回矢量(按值返回,不要费心去分配它,因为你的编译器可能支持move-semantics)。

std::vector<int> func(
    const std::tuple<int, int>& a, const std::tuple <int, int>& b) 
{ 
    std::vector<int> ret; 
    ret.push_back(...); 
    ret.push_back(...); 
    return ret; 
} 
+0

每当我尝试实现这个时,我都会收到“没有类型的元组的C++禁止声明”错误。有任何想法吗? – 2012-08-12 10:45:33

+0

该函数具有一组元组作为输入,而不仅仅是2个元组,返回矢量的效率非常低,并且通常证明可读性较差。 – 2012-08-12 10:46:02

+0

你错过了包括尝试'#包括'但这种解决方案通常不是很优雅。查看我上面的评论。 – 2012-08-12 10:47:09

0
void function(const std::vector<std::pair<int,int>> &pairs, 
    std::vector<int> &output) { 
    /* ... */ 
} 
+0

您能否澄清一下为什么配对和输出是这段代码中的引用? – 2012-08-12 10:28:01

+1

,以避免复制昂贵的完整向量 – 2012-08-12 10:31:59

+0

@GiovanniAzua [移动语义](http://stackoverflow.com/questions/3106110/)使得返回一个非常便宜的矢量。 – fredoverflow 2012-08-12 11:03:14

相关问题