給定
std::vector<int> vec1大小s_vec和容量c。std::vector<int> vec2.std::map<int, int> m大小s_m >= s_vec。std::unordered_set<int> flags.bool flag = False
我想在不超過容量的情況下將m(按順序) 的盡可能多的值復制到vec1(覆寫以前的值) 中c。如果還有任何值,我想將這些值推到vec2. 對于其中的每一個,我想檢查它們是否在flags. 如果是,我想設定flag為true。
這就是我目前的實作方式:
int i = 0;
for (auto const& e : m) {
if(i < c) {
if(i == vec1.size()) {
vec1.push_back(e.second);
} else {
vec1.at(i) = e.second;
}
} else {
vec2.push_back(e.second);
if(flags.count(e.second)){
flag = true;
}
}
}
我是來自 python 和 R 的 C 新手。因此,我認為這可以簡化很多(使用迭代器?)。我能做些什么來改進這里的代碼?
uj5u.com熱心網友回復:
您的代碼必須在每個回圈結束時遞增 i 才能正常作業。
如果您可以使用 c 20 及其范圍,我可能會將其完全重寫為:
using namespace std::views; // for simplicity here
std::ranges::copy(m | take(c) | values, vec1.begin());
std::ranges::copy(m | drop(c) | values, std::back_inserter(vec2));
flag = std::ranges::any_of(vec2, [&flags](int i){return flags.contains(i);});
這樣做的美妙之處在于它更符合您的要求。
- 第一行是:“我想將盡可能多的 m 值(按順序)復制到 vec1(覆寫以前的值)而不超過容量 c。 ”
- 第二行是:“如果還有任何值,我想將這些值推到 vec2 的末尾。 ”
- 第三行是:“對于其中的每一個,我想檢查它們是否在標志中。如果是,我想將標志設定為真。 ”
uj5u.com熱心網友回復:
基于@PaulMcKenzie 的評論以及@Nelfeal 和@cptFracassa 提供的答案,這就是我的最終結果。
size_t new_size = std::min(vec1.capacity(), m.size());
vec1.resize(new_size);
std::transform(m.begin(),
std::next(m.begin(), new_size),
vec1.begin(),
[](std::pair<int, int> p) { return p.second; });
std::transform(std::next(m.begin(), new_size),
m.end(),
std::back_inserter(vec2),
[&flags, &flag](std::pair<int, int> p) {
if(flags.count(p.second)) {
flag = true;
}
return p.second;
});
uj5u.com熱心網友回復:
在第一部分,你可以只做向量和所有東西,而不是做任何一個push_back或賦值給。不改變.atclearpush_backclearcapacity
您的回圈正在做兩件不同的事情,一件接一件(順便說一句,我假設您忘記了 increment i)。你應該把它分成兩個回圈。
有了這一切,您的代碼變為:
vec1.clear();
auto it = m.begin();
for (int i = 0; i < c; i) {
vec1.push_back(it->second);
it;
}
while (it != m.end()) {
vec2.push_back(it->second);
if(flags.count(it->second)){
flag = true;
}
it;
}
此時,您還可以使用標準演算法(std::copy如std::transform評論中所述)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/513361.html
下一篇:帶有模板模板引數的模板決議
