C++ 获取向量元素时出错
我试图创建一个函数,该函数接受字符串并将字符串中的元素放入向量中,唯一的条件是重复的连续元素被写入,例如:AABBC->['a','B','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) {
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;
}