2015-10-06 38 views
-1

帮助我学习C++,我写了下面的代码:C++函数返回一个值,需要在优化

#include <cstdio> 
#include <string> 
#include <unordered_map> 
#include <vector> 

using namespace std; 

unordered_map<int, vector<uint8_t>> m; 

vector<uint8_t> getBitVec(int id) 
{ 
     unordered_map<int, vector<uint8_t>>::const_iterator it = m.find(id); 
     if (it != m.cend()) { 
       return it->second; 
     } 
     return vector<uint8_t>(); 
} 

void aND(vector<uint8_t>& dst, const vector<uint8_t>& src) 
{ 
     for (auto i = 0U; i != dst.size(); i++) { 
       dst[i] = dst[i] & src[i]; 
     } 
} 

// Get a resultant vector of line_item ids from a bit vector of line items 
vector<uint16_t> getVec(const vector<uint8_t>& s) 
{ 
     vector<uint16_t> result; 
     for (auto i = 0U; i != s.size(); i++) { 
       uint8_t temp = (1<<7); 
       for (int j = 0; j < 8; j++) { 
         if (s[i] & (temp >> j)) { 
           result.push_back(i * 8 + j); 
         } 
       } 
     } 
     return result; 
} 


vector<uint16_t> find2(const vector<int>& k) 
{ 
     vector<uint8_t> result; 
     bool flag = true; 

     for (auto i = 0U; i != k.size(); i++) { 
       const vector<uint8_t>& v = getBitVec(k[i]); 
       if (v.empty()) { 
         return vector<uint16_t>(); 
       } 
       if (flag == true) { 
         //result = move(v); 
         result = v; 
         flag = false; 
         continue; 
       } 
       aND(result, v); 
     } 
     return getVec(result); 
} 

void init() 
{ 
     m[1].push_back(0xff); 
     m[1].push_back(0xfe); 

     m[2].push_back(0xf8); 
     m[2].push_back(0xf9); 

     m[3].push_back(0xf1); 
     m[3].push_back(0xf2); 
} 

int main() 
{ 
     init(); 
     const auto& t = find2(vector<int>{1, 2, 3}); 
     for (auto i = 0U; i != t.size(); i++) { 
       fprintf(stderr, "\n%d\n", t[i]); 
     } 
     return 0; 
} 

基本上我希望编写或者返回到非本地参考功能“重”对象或空对象的副本。

我正在执行的功能是getBitVec(如在URL中)。 有人可以告诉aND将在返回的矢量的“临时副本”上操作还是不创建副本。

我认为aND函数将对副本进行操作,我想避免副本的开销,因为代码不需要副本。但是,我可以在不更改getBitVec的界面的情况下执行此操作吗?

这不是一个难题或假设性的问题,我不寻找花样等在“m”个存储定点键(具有值=矢量())并返回对它的引用,从而改变签名 矢量& getBitVect(const vector &)

这是C++ 11中的惯用代码吗?

我不得不使用指针作为getBitVec的返回类型吗?

感谢您的耐心等待。

+0

标题是混乱的,我的意思是 “价值” 没有引用 –

回答

0

如果您需要一个const引用,而不是返回一个空对象的副本,您可以在函数中创建一个空对象的静态本地实例(所以一旦第一次调用函数就会创建该实例并保持活动状态,直到程序终止),并返回对这个静态空对象的引用。

如果您打算返回非const引用(函数的调用者可能会修改对象),那么最好是返回指向对象而不是引用的指针,如果找不到对象,则返回nullptr。

const vector<uint8_t>& getBitVec(int id) 
{ 
     unordered_map<int, vector<uint8_t>>::const_iterator it = m.find(id); 
     if (it != m.cend()) { 
       return it->second; 
     } 
     static const vector<uint8_t> empty_vec; 
     return empty_vec; 
} 

或者

vector<uint8_t>* getBitVec(int id) 
{ 
     unordered_map<int, vector<uint8_t>>::const_iterator it = m.find(id); 
     if (it != m.cend()) { 
       return &(it->second); 
     } 
     return nullptr; 
}