帮助我学习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
的返回类型吗?
感谢您的耐心等待。
标题是混乱的,我的意思是 “价值” 没有引用 –