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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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++ - Fatal编程技术网

C++ 获取向量元素时出错

C++ 获取向量元素时出错,c++,C++,我试图创建一个函数,该函数接受字符串并将字符串中的元素放入向量中,唯一的条件是重复的连续元素被写入,例如:AABBC->['a','B','C']。我的代码如下 std::vector<char> uniqueInOrder(const std::string& iterable){ std::vector<char> result; for(int i = 0; i <= iterable.size(); ++i) {

我试图创建一个函数,该函数接受字符串并将字符串中的元素放入向量中,唯一的条件是重复的连续元素被写入,例如:AABBC->['a','B','C']。我的代码如下

std::vector<char> uniqueInOrder(const std::string& iterable){
    std::vector<char> result;
    for(int i = 0; i <= iterable.size(); ++i)
    {
        if(i==0 || result[i-1] != iterable[i]){
            result.push_back(iterable[i]);
        }else{continue;}

    }
    return result;

}
int main(){
    auto result  = uniqueInOrder("AABBC");
    for(auto val: result){std::cout << val  <<"\n";}
    return 0;
}
函数的预期输出为:['A','B','C'] 实际输出为:['A','B','B','C']
我不明白为什么它不起作用。显然,在if语句中,当我得到result[I]元素时,当应该已经有一个元素在里面时,它什么也得不到。

您对结果的索引是错误的。i是iterable的索引,但您使用i-1作为结果的索引。当您到达循环的第四次迭代时,您将看到结果[2]结果的第三个元素,但结果只有2个元素;{'A','B'},所以您没有得到任何有用的未定义行为,当然也没有得到预期的'B'


将结果[i-1]替换为result.back,使其始终读取最后一个元素。

Stu提供了一种解决方案。另一种选择是与iterable[i-1]进行比较

这一行:

for(int i = 0; i <= iterable.size(); ++i)
这是完全没有必要的

本部分:

    if(i==0 || result[i-1] != iterable[i]){
可以是:

    if(i==0 || iterable[i-1] != iterable[i]){
首先让字符串按原样传递给vector。现在使用STL功能删除向量中重复的连续元素


也可以直接将这个特性应用到.< /P>< P>作为一个附加的解决方案,我想提供一个更现代的C++算法。 你的任务基本上可以用一个班轮和一个Lambda来完成

我们使用STL:std::copy_if中的算法。因此,我们将数据从字符串复制到向量,但前提是当前字符与前一个不同

有了taht,一切都将简化为一个语句

int main() {

    // The source string
    std::string s{ "1133310133778" };

    // The desitnation vector
    std::vector<char> v{};

    // One liner to do the copying
    std::copy_if(s.begin(), s.end(), std::back_inserter(v), [last = 0](const char c) mutable { bool retval{ true }; if (last == c)  retval = false; last = c; return retval; });

    // Debug output
    std::copy(v.begin(), v.end(), std::ostream_iterator<char>(std::cout, "\n"));

    return 0;
}
由于没有人能在长线上读到这篇文章,我将插入一些新行以便于阅读:

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <vector>

int main() {

    // The source string
    std::string s{ "1133310133778" };

    // The desitnation vector
    std::vector<char> v{};

    // One statement to do the copying
    std::copy_if(
        s.begin(), 
        s.end(), 
        std::back_inserter(v), 
        [last = 0](const char c) mutable { 
            bool retval{ true }; 
            if (last == c)  
                retval = false; 
            last = c; 
            return retval; 
        }
    );

    // Debug output
    std::copy(v.begin(), v.end(), std::ostream_iterator<char>(std::cout, "\n"));

    return 0;
}
这与befor相同,只是有更多新行。

result.back是数组中的最后一个元素。将其与iterable[i]进行比较。如果您使用result[i-1],那么您相信到目前为止的每一次插入都已成功,而对于eg aaaabbbbbbbbbbc,情况并非如此。
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <vector>

int main() {

    // The source string
    std::string s{ "1133310133778" };

    // The desitnation vector
    std::vector<char> v{};

    // One statement to do the copying
    std::copy_if(
        s.begin(), 
        s.end(), 
        std::back_inserter(v), 
        [last = 0](const char c) mutable { 
            bool retval{ true }; 
            if (last == c)  
                retval = false; 
            last = c; 
            return retval; 
        }
    );

    // Debug output
    std::copy(v.begin(), v.end(), std::ostream_iterator<char>(std::cout, "\n"));

    return 0;
}