2016-04-10 55 views
2

我想从一个C++向量中使用while循环和pop_back删除尾随零。如果矢量的最后一个元素是0,它应该弹出最后一个元素,直到它不再是0。如何从C++中删除尾随0向量

很难理解错误的含义,如果有人更聪明,请帮助解读这些错误,我会非常感激!

void Integer::unzero() { 

    while ((*this).bits_vector[((*this).bits_vector.size)] == 0) { 
    (*this).bits_vector.pop_back; 
    } 
} 

错误:

error C2679: binary '[': no operator found which takes a right-hand operand of type 'overloaded-function' (or there is no acceptable conversion) 

error C3867: 'std::vector<bool,std::allocator<_Ty>>::pop_back': non-standard syntax; use '&' to create a pointer to member 
+0

在一个不相关的注释中:'(* this).bits_vector'与'this-> bits_vector'相同,在类的范围内它也与'bits_vector'相同。 –

+1

您需要在'size()'和'pop_back()'使用'()'' –

+0

更严重的问题,但与您遇到的错误无关,当您解决问题时,您将索引vector *边界*这是*未定义的行为*。矢量索引就像数组索引一样,基于零。这意味着矢量中的索引从零变为'size() - 1'。 –

回答

3

在表达(*this).bits_vector.size您使用the size member function作为一个值,你不调用该函数。

同样的问题pop_back,这是一个成员函数你需要呼叫

所以,你的固定代码(考虑我的意见为好)应该是这样,我添加了一个检查,以确保该向量不为空,因为如果它是你本来有

while (!bits_vector.empty() && bits_vector[bits_vector.size() - 1] == 0) { 
    bits_vector.pop_back(); 
} 

注负面指数。

+0

非常感谢! – Alexander

+2

@Alexander你可以去掉循环索引并写下:'while(!v.empty()&& v.back()== 0){v.pop_back(); }' –

0
(*this).bits_vector.pop_back; 

不调用该函数。它只是评估一个成员函数。使用:

(*this).bits_vector.pop_back(); 

您与size成员函数有同样的问题。

while ((*this).bits_vector[((*this).bits_vector.size)] == 0) { 
              ^^^^^^ 

你并不需要使用size()[]运营商。您可以简单地使用:

while (!(*this).bits_vector.empty() && // Makes sure you don't call back() on an empty vector 
     (*this).bits_vector.back() == 0) { 
    (*this).bits_vector.pop_back(); 
} 
+0

请注意,它也是更安全的检查!空()之前访问回() – Philipp

+0

@菲利普,好点。谢谢 :) –

0

这将通过修改向量一次删除尾随零。

int i; 
for(i = v.size() - 1; i >= 0 && v[i] == 0; --i); 
bits_vector.resize(i + 1); 
3

使用std::find_ifstd::vector::erase

auto rit = std::find_if(bits_vector.rbegin(), bits_vector.rend(), 
         [](int v) { return v != 0; }); 
bits_vector.erase(rit.base(), end(bits_vector)); 

顺便说一句,你忘了括号:bits_vector.size()bits_vector.pop_back()