gpt4 book ai didi

c++ - 从 vector 中删除空元素

转载 作者:行者123 更新时间:2023-12-01 14:39:56 25 4
gpt4 key购买 nike

我正在尝试从 std::vector 中删除空条目。这是一个示例代码,但这里有问题。

#include <iostream>
#include <string>
#include<vector>
#include <cctype>

int main()
{
std::vector<std::string> s1 = {"a"," ", "", "b","c"," ","d"};
for (auto it = s1.begin(); it != s1.end() && isspace(*it); )
{
it = s1.erase(it);
}

std::cout<<"vector size = "<<s1.size();
for (auto &i:s1)
std::cout<<i<<"\n";

}

我正在运行一个 for 循环来找出空元素并从那里删除。应该也有STL方法,但不确定它是如何工作的。

最佳答案

看来你的意思是下面的

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

int main()
{
std::vector<std::string> v = { "a", " ", "", "b", "c", " ", "d" };

auto is_empty = []( const std::string &s )
{
return s.find_first_not_of( " \t" ) == std::string::npos;
};

v.erase( std::remove_if( std::begin( v ), std::end( v ), is_empty ), std::end( v ) );

for ( const auto &s : v )
{
std::cout << "\"" << s << "\" ";
}
std::cout << std::endl;

return 0;
}

程序输出为

"a" "b" "c" "d" 

至于你的代码,它是低效的,因为你试图分别删除每个找到的元素,例如这个循环

for (auto it = s1.begin(); it != s1.end() && isspace(*it); )
{
it = s1.erase(it);
}

永远不会迭代,因为第一个元素不满足条件 isspace(*it) 而且无效。也就是说,您正在将 std::string 类型的对象提供给需要 char 类型对象(更准确地说是 int< 类型的对象)的函数)。

如果使用 C 函数 isspace 则程序可以如下所示。

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

int main()
{
std::vector<std::string> v = { "a", " ", "", "b", "c", " ", "d" };

auto is_empty = []( const std::string &s )
{
return std::all_of( std::begin( s ), std::end( s ),
[]( char c )
{
return std::isspace( ( unsigned char )c );
} );
};

v.erase( std::remove_if( std::begin( v ), std::end( v ), is_empty ), std::end( v ) );

for ( const auto &s : v )
{
std::cout << "\"" << s << "\" ";
}
std::cout << std::endl;

return 0;
}

程序输出与上图相同。

关于c++ - 从 vector 中删除空元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60101088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com