C++ 当我检测到向量的变化时,改变某些值
我有以下向量:C++ 当我检测到向量的变化时,改变某些值,c++,vector,C++,Vector,我有以下向量: vector<int> vec = {2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9}; 我想遍历数组并相应地更改偏移值。 例如,如果我们从一开始(在前2个)开始,那么 offset = 0; 然后,当它到达第二个2点时,我想 offset = -16; 但一旦我看到数组值不再是2(它会改变),我希望偏移量重置为0(然后如果它看到下一
vector<int> vec = {2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9};
我想遍历数组并相应地更改偏移值。
例如,如果我们从一开始(在前2个)开始,那么
offset = 0;
然后,当它到达第二个2点时,我想
offset = -16;
但一旦我看到数组值不再是2(它会改变),我希望偏移量重置为0(然后如果它看到下一个3,它将变成offset=offset-16
)
我想从偏移量值中减去16,只要向量中的值在迭代过程中不变。但一旦我检测到变化,我想重置偏移量
最好的方法是什么 这正是您用翻译成代码的文字所解释的:
vector<int> vec = {2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9};
int offset = 0;
int current = vec[0];
for (unsigned i = 1; i< vec.size(); ++i) {
if (vec[i] == current) offset -= 16;
else offset = 0;
current = vec[i];
}
vec={2,2,3,3,3,4,4,4,4,4,5,6,6,8,8,8,8,8,8,8,8,9,9};
整数偏移=0;
int电流=向量[0];
for(无符号i=1;i
虽然我真的不明白这对什么有好处,或者你说的“最佳方式”是什么意思。但是,代码太多了,无法发表评论……这正是您用翻译成代码的文字所解释的:
vector<int> vec = {2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9};
int offset = 0;
int current = vec[0];
for (unsigned i = 1; i< vec.size(); ++i) {
if (vec[i] == current) offset -= 16;
else offset = 0;
current = vec[i];
}
vec={2,2,3,3,3,4,4,4,4,4,5,6,6,8,8,8,8,8,8,8,8,9,9};
整数偏移=0;
int电流=向量[0];
for(无符号i=1;i
虽然我真的不明白这对什么有好处,或者你说的“最佳方式”是什么意思。但是,代码太多,无法发表评论……不清楚您想用偏移量做什么,或者您想从哪里获得它。但是,如果您只是想在每个元素的基础上输出它,您可以使用hack或类似的方法:
auto offset = 0;
cout << offset << ' ';
adjacent_find(cbegin(vec), cend(vec), [&](const auto lhs, const auto rhs){
if(lhs == rhs) {
offset -= 16;
} else {
offset = 0;
}
cout << offset << ' ';
return false;
});
自动偏移=0;
cout不清楚你想用偏移量做什么,或者你想在哪里得到它。但是,如果您只是想在每个元素的基础上输出它,您可以使用hack或类似的方法:
auto offset = 0;
cout << offset << ' ';
adjacent_find(cbegin(vec), cend(vec), [&](const auto lhs, const auto rhs){
if(lhs == rhs) {
offset -= 16;
} else {
offset = 0;
}
cout << offset << ' ';
return false;
});
自动偏移=0;
不能包含
#包括
int测试(const std::vector和vec)
{
整数偏移=0;
int previous=vec.size()>0?vec[0]:0;
用于(自动和当前:vec)
{
如果(先前==当前)偏移量-=16;
else偏移=0;
先前=当前;
}
返回偏移量;
}
int main(int,char*[])
{
std::cout#包括
#包括
int测试(const std::vector和vec)
{
整数偏移=0;
int previous=vec.size()>0?vec[0]:0;
用于(自动和当前:vec)
{
如果(先前==当前)偏移量-=16;
else偏移=0;
先前=当前;
}
返回偏移量;
}
int main(int,char*[])
{
std::cout以下是我如何概括这个问题:
通过引用将其传递给函数
检查向量是否为空,如果为空,则引发异常
为
循环设置一个,并在其外部声明偏移量
,以便您可以随时手动重置偏移量
实施示例:
#include <iostream>
#include <vector>
#include <stdexcept>
void gen_offset(const std::vector<int>& vec) {
if (vec.empty()) {
throw std::runtime_error("Vector is empty");
}
int offset = 0;
int curr_val = vec[0];
for (size_t i = 1; i != vec.size(); ++i) {
if (vec[i] == curr_val) {
offset -= 16;
}
else {
std::cout << curr_val << " => " << offset << std::endl;
offset = 0;
curr_val = vec[i];
}
}
}
int main() {
std::vector<int> vec = {2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
5, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9};
gen_offset(vec);
return 0;
}
下面是我如何概括这个问题的:
通过引用将其传递给函数
检查向量是否为空,如果为空,则引发异常
为
循环设置一个,并在其外部声明偏移量
,以便您可以随时手动重置偏移量
实施示例:
#include <iostream>
#include <vector>
#include <stdexcept>
void gen_offset(const std::vector<int>& vec) {
if (vec.empty()) {
throw std::runtime_error("Vector is empty");
}
int offset = 0;
int curr_val = vec[0];
for (size_t i = 1; i != vec.size(); ++i) {
if (vec[i] == curr_val) {
offset -= 16;
}
else {
std::cout << curr_val << " => " << offset << std::endl;
offset = 0;
curr_val = vec[i];
}
}
}
int main() {
std::vector<int> vec = {2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
5, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9};
gen_offset(vec);
return 0;
}
然后,当它到达第二个2时,我想要offset=-16;
.WUT?将上一个值保留在一个单独的变量中。如果它与当前值不同,则执行您需要执行的任何操作,并将上一个值变量设置为当前值。最佳方法?没有线索。一种方法?编写一个循环,按照您的解释执行换句话说。你所期望的答案有点模糊……听起来像是家庭作业。我唯一能想到的是,当它到达第二个2时,我想要offset=-16;
.WUT?将前一个值保留在一个单独的变量中。如果它与当前值不同,那么做你需要做的任何事情,然后设置将上一个值变量转换为当前值。最好的方法是什么?没有线索。一种方法是什么?写一个循环,按照你用文字解释的内容进行。你期望的答案有点模糊……听起来像是一个家庭作业。我能想到的唯一一件事是当vec
为空时,你如何处理这种情况?@Ayxan我知道nt,初始化是硬编码的,为什么我要处理一些不可能发生的事情?它肯定不会保持硬编码,至少添加一个小音符会很有用。当vec
为空时,你如何处理这种情况?@Ayxan我不知道,初始化是硬编码的,为什么我要处理一些不可能发生的事情?它肯定不会保持hard编码并至少添加一个小注释对于每个(vec中的自动和当前)IMO都很有用<代码> C代码中的C?代码?@ AXXANNO,这是一个带有自动引用的C++ C++循环。应该是C++ 11的一部分。@ AyxaH-AI我看到你纠正了。所以以前有每个语法的我认为这是Visual Studio中的一些实验特性,而我在自动完成我的快乐的过程中没有注意到。<代码>“代码>不是有效的C++,它不会编译的方式看起来是,是这样的。VS2017输出:<代码>非标准扩展”为每个“使用:替换为范围为语句< /代码>。<代码> C++ C++中的C++代码?@ AyxANNo,这是一个带有自动引用的范围C++循环。应该是C++ 11的一部分。@ AXXAN-AH-我看到你纠正了它。所以以前的每个语法都是我想的。