我是STL的新手,正在尝试一个简单的程序,使用push_back插入元素,并尝试删除甚至索引的元素。
我取了n个元素并将其推入向量。但是,当我擦除它时,我会遇到分段错误或某些不希望的输出。
const publicUploads = path.join(__dirname, '../../../public/uploads/');
const storage =
multer.diskStorage({
destination: publicUploads,
filename(req, file, cb){
cb(null,`${file.fieldname}-${Date.now()}${path.extname(file.originalname)}`)
}
});
const upload = multer({
storage,
limits: {
fileSize: 1000000
},
fileFilter(req, file, cb){
if(!file.originalname.match(/\.(jpeg|jpg|png)$/)){
return cb(new Error('Please upload an image file'))
}
cb(null, true)
}
})
router.put('/admin/posts/edit/:id', upload.single('image'), async (req, res) => {
const updates = Object.keys(req.body);
const allowedUpdates = ['title', 'body', 'status', 'image', 'allowComments'];
const isValid = updates.every(update => allowedUpdates.includes(update));
if(!isValid){
return res.send({Error: 'Invalid Update'})
}
try {
const post = await Post.findOne({_id: req.params.id});
if(!post){
return res.send({Error: 'Could not find your post'})
}
if(req.file){
fs.unlinkSync(`${publicUploads}${post.image}`);
post.image = req.file.filename
}
updates.forEach(update => {
post[update] = req.body[update]
})
post.allowComments = req.body.allowComments === 'on'? true:false;
await post.save();
req.flash('notice', 'Your post was edited successfully!')
res.status(200).redirect('/admin/posts')
} catch (error) {
res.send({Error: error})
}
}, (error, req, res, next) => {
res.send({Error: error})
})
如果我使用n-1而不是n,它可以工作,但不能提供所需的输出。
答案 0 :(得分:0)
只是为了娱乐您的解决方案
<form action="/cart" method="POST" >
<input type="submit" class="btn btn-sm btn-primary"
onclick="myfunction('<%= i %>')" name="submit" value="Add to my Cart" >
</form>
<script >
function myfunction(i) {
console.log(i);
var n = document.images.item(i).src;
console.log(n)
var el = document.querySelectorAll("#demo");
console.log(el[i].innerText)
var newdata={img :n ,title:el[i].innerText}
return(newdata)
}
</script>
答案 1 :(得分:0)
您可以做到
for(i=n-1;i<=0;i--)
如评论中所述,向量的earing元素会减小向量的大小。 通过更改for循环条件,您将开始从向量末尾开始甚至收录索引。这样,向量大小的改变不会有问题。
答案 2 :(得分:0)
通过始终使用erase
删除元素,您的函数将具有O(n²)运行时。更好的选择是先压缩元素,然后再擦除其余元素之后的所有元素:
#include <utility>
#include <vector>
void remove_odd_indices(std::vector<int> & inout)
{
auto write = inout.begin();
auto read = inout.begin();
for(auto n = inout.size(), i = 0 * n; i < n; ++i, ++read)
{
if(i % 2 == 0)
continue;
*write++ = std::move_if_noexcept(*read);
}
inout.erase(write, inout.end());
}
答案 3 :(得分:0)
请记住计数,只需将itr初始化为正确位置即可 擦除后,相同的itr指向向量中的下一个未删除元素
vector<int> vec = { 1,2,3,4,5,6,7,8,9,10};
int main()
{
auto itr=vec.begin();
while( itr != vec.end() ){
itr++;
vec.erase(itr);
}
for(auto data : vec) cout << " " << data << " " ;
cout << endl;
}