Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当我检测到向量的变化时,改变某些值_C++_Vector - Fatal编程技术网

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-我看到你纠正了它。所以以前的每个语法都是我想的。