小编use*_*869的帖子

删除特定元素的std :: erase和std :: remove组合不适用于特定示例

#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<int> a = {1,2,3,7,1,5,4};
    vector<int> b = {6,7,4,3,3,1,7};
    a.erase(remove(a.begin(),a.end(),a[0]),a.end());
    b.erase(remove(b.begin(),b.end(),b[0]),b.end());

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

对于这个具体的例子,我的GNU gdb Ubuntu 7.7.1声明返回1行:a = {2,3,7,1,5,4}这是不期望的(只删除一个1),并且b = {7 ,4,3,3,1}这是不期望的.

我的期望是b应该是a = 2,3,7,5,4和b = 7,4,3,3,1,7.

这里发生了什么事?

c++ stl erase-remove-idiom

20
推荐指数
1
解决办法
2225
查看次数

为什么即使超出范围,存储在C++ STL向量中的堆栈分配元素仍然存活?

我有以下代码:

#include <vector>
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {

    vector<int > vi;

    for(int i=0; i<10; i++) {
        int j=i*i;
        vi.push_back(j);
    }

    for(int i=0; i<(int)vi.size(); i++)
        cout<<vi[i]<<" ";
    cout<<endl;

    return 1;
Run Code Online (Sandbox Code Playgroud)

}

执行此代码将返回"0 1 4 9 16 25 36 49 64 81",但这对我来说并不直观.

据我所知,当变量在堆栈上分配时,变量在超出范围时被解除分配.我也知道C++ STL向量存储指向变量的指针.为什么尽管整数在堆栈上被分配并超出范围,但向量仍保持有效整数?由于整数被解除分配,矢量保持的指针不应该被取消吗?

c++ stack vector

0
推荐指数
1
解决办法
199
查看次数

标签 统计

c++ ×2

erase-remove-idiom ×1

stack ×1

stl ×1

vector ×1