#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;
}
За този конкретен пример моята 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.
какво се случва тук
{2,3,7,5,4};
? - person juanchopanza   schedule 25.02.20152,3,7,5,4
(и двете1
се премахват)? Вярвам, че нарушавате някакво предварително условие, като предавате препратка към член наvector
, който итерирате. И двата реда могат да бъдат коригирани чрез копиране -+a[0]
и+b[0]
- person Praetorian   schedule 25.02.2015+
за това не граничи ли с объркване? (На теорияint(a[0])
също трябва да работи; резултатът е rvalue и използването му за инициализиране на препратка не трябва да води до псевдоним на която и да е съществуваща стойност, където и да е. Не знам дали ще се чувствам комфортно да разчитам на компилаторът обаче не оптимизира това. И това също не е по-ясно; разграничението lvalue-rvalue често е много фино.) - person James Kanze   schedule 25.02.2015+
иint(a[0])
попадат в една и съща кофа за обфускиране и бих се разплакал, ако видя код като този в преглед например. Но когато публикувам коментар на SO ... по-малко натискания на клавиши FTW :) Ако вместо това публикувах отговор, щях да съхраня стойността във временна променлива, както е показано по-долу. - person Praetorian   schedule 25.02.2015return 1
вместо0
? - person Lightness Races in Orbit   schedule 25.02.2015