vector::erase由于某种原因,当比较语句内部的返回值if或者先存储值然后比较时,我会得到不同的结果。但这似乎只发生在 g++ 中。
这是使用 g++、libstdc++ 和-std=c++14flag 在 Ubuntu 20.04 AMD64 上构建的。
g++ -std=c++14 foo.cpp && ./a.out
这将返回false
#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
std::vector<int> v{0, 1, 8, 3, 8, 5, 8, 7,8, 9};
int thing_id{9};
std::vector<int>::iterator const cit{
std::remove_if(v.begin(),
v.end(),
[thing_id](int const& thing) -> bool {
return thing == thing_id;
})};
if (v.erase(cit, v.cend()) == v.cend()) {
std::cout << "true\n";
return true;
}
else {
std::cout << "false\n";
return false;
} …Run Code Online (Sandbox Code Playgroud) 是否有一个算法可以从容器中删除元素,如下面的代码所示?
vec_it = std::remove_if( vec.begin(), vec.end(), pred );
vec.erase( vec_it, vec.end() );
Run Code Online (Sandbox Code Playgroud) 我很难删除第一个括号"("和最后一个括号"("包括它们)之间的所有字符.这是我用来使其工作的测试程序,但没有成功......
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str = "( 1221 ( 0 0 0 ) (1224.478541112155452 (1.32544e-7 0 0 ) ) )";
int count = 0;
for (std::string::size_type i = 0; i < str.size(); ++i)
{
if (str[i] == '(')
{
count += 1;
}
cout << "str[i]: " << str[i] << endl;
if (count <= 4)
{
str.erase(0, 1);
//str.replace(0, 1, "");
}
cout << "String: " << str << endl;
if (count …Run Code Online (Sandbox Code Playgroud) 如何从struct的vector中删除所有值,其中struct value k等于0?
struct tabuRecord {
int x;
int y;
int k;
tabuRecord( int x, int y, int k)
: x(x), y(y), k(k){}
};
vector <tabuRecord> tabu;
v.insert(v.begin(), tabuRecord(1, 2, 3));
v.insert(v.begin(), tabuRecord(4, 5, 0));
v.insert(v.begin(), tabuRecord(7, 8, 9));
v.insert(v.begin(), tabuRecord(10, 11, 0));
Run Code Online (Sandbox Code Playgroud)
我试过了
tabu.erase(std::remove(tabu.begin(), tabu.end(), tabu.k=0), tabu.end());
Run Code Online (Sandbox Code Playgroud)
和
tabu.erase(std::remove(tabu.begin(), tabu.end(), tabuRecord.k=0), tabu.end());
Run Code Online (Sandbox Code Playgroud) 由于std::set不insert()重复,因此可以确保包含唯一元素。使用重载时erase(const key_type&),其对象将最多包含1个相同值的元素。因此,它可能返回1(如果存在)或0(否则)。
什么时候可以erase(const key_type&)返回超过1?
换句话说,返回a size_type而不是simple 的目的是什么bool?
我想从向量中删除一个元素,但不能保证该元素存在。我在网上查看过,但没有发现有关擦除删除习语如何处理不在容器中的值的信息。
我的向量是这样声明的:(在代码的其他部分中添加/修改了成员)
std::vector<Person*> _members
Run Code Online (Sandbox Code Playgroud)
我想在包含 _members 作为属性的类 Group 中创建一个 remove 方法,以尝试从组中删除给定的人。
我目前正在使用:(要删除的人是指向 Person 对象的指针)
_members.erase(std::remove(_members.begin(), _members.end(), person_to_remove), _members.end());
Run Code Online (Sandbox Code Playgroud)
这将如何处理试图删除不在向量中的 Person ?理想情况下,我还想返回一个布尔值来确认删除是否成功,我当前的实现有没有办法这样做?
如何从向量中删除重复元素但从前面开始?
所以
2 3 4 5 2 5 会成为 3 4 2 5
1 5 3 1 会成为 5 3 1
我希望该解决方案易于阅读,如果它也具有良好的性能,那就太好了。
比如,我在代码中有两个向量,我希望使用迭代器擦除向量"data"中的向量"index_to_filter"索引的元素.代码中的虚拟方式只是指出明显的错误.到目前为止,我无法让它工作,也不知道这是否可以成为擦除 - 删除 - 成语?.有没有办法去错过它?
谢谢.
#include <iostream>
#include <vector>
int main()
{
std::vector<int> data{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::vector<int> index_to_filter{ 1, 5, 8 };
/* needed result data = { 0, 2, 3, 4, 6, 7, 9 }*/
std::vector<int>::iterator iter = index_to_filter.begin();
while (iter != index_to_filter.end())
{
std::vector<int>::iterator iter_data = data.begin() + *iter;
iter_data = data.erase(iter_data);
iter++;
}
/* Throws : vector erase iterator outside range */
for …Run Code Online (Sandbox Code Playgroud) 这是我第一次使用这个成语,我有一个向量v1,其中元素必须是另一个向量中元素的子集v2.现在,想象v1和v2作为集合,我想执行v2-v1并抛出异常(如果v1[i]不存在)v2(对于任何有意义的i).
我想出了这个:
std::vector<T> v1;
std::vector<T> v2;
//fill v1, v2 somehow
for(size_t i=0; i<v1.size(); i++){
v2.erase(std::remove(v2.begin(), v2.end(), v1[i]), v2.end());
if(/*erase option failed because v1[i] doesn't exists in v2*/)
throw std::runtime_exception (std::to_string(i)+"-th in v1 doesn't exists in v2!");
}
Run Code Online (Sandbox Code Playgroud)
我该如何填写这个if条件?