为什么不转发迭代器有附加赋值运算符?

时间:2016-06-02 17:43:46

标签: c++ iterator forward-list

我知道function GetDistance(img, lRimborsoKm, txtRimborso, hfImportoRimborso, hfLastOfTheDay) { var latA = img.attributes['latA'].value; var lngA = img.attributes['lngA'].value; var latB = img.attributes['latB'].value; var lngB = img.attributes['lngB'].value; var latC = img.attributes['latC'].value; var lngC = img.attributes['lngC'].value; var isLastOfTheDay = hfLastOfTheDay.value; if (latC == '' && lngC == '') // A -> B + B -> A { source = new google.maps.LatLng(latA, lngA); destination = new google.maps.LatLng(latA, lngA); var waypts = []; waypts.push({ location: new google.maps.LatLng(latB, lngB), stopover: true }) GetDist(source, destination, waypts, function () { distance = Number(this); var fullDistance = Number(distance); }); } else if (isLastOfTheDay == 'True') { // A -> B + B -> C source = new google.maps.LatLng(latA, lngA); destination = new google.maps.LatLng(latC, lngC); var waypts = []; waypts.push({ location: new google.maps.LatLng(latB, lngB), stopover: true }) GetDist(source, destination, waypts, function () { distance = Number(this); var fullDistance = Number(distance); }); } else { // A -> B source = new google.maps.LatLng(latA, lngA); destination = new google.maps.LatLng(latB, lngB); var waypts = []; GetDist(source, destination, waypts, function () { distance = Number(this); var fullDistance = Number(distance); }); } } function GetDist(source, destination, waypts, fn) { directionsService.route({ origin: source, destination: destination, waypoints: waypts, optimizeWaypoints: true, avoidHighways: true, avoidTolls: true, travelMode: google.maps.TravelMode.DRIVING }, function (response, status) { if (status === google.maps.DirectionsStatus.OK) { var route = response.routes[0]; var distance = 0; for (var i = 0; i < route.legs.length; i++) { var routeSegment = i + 1; distance += Math.floor(route.legs[i].distance.value / 1000); } fn.call(distance); } else { fn.call(0); console.log(status); console.log('latA: ' + source.lat() + ', lngA: ' + source.lng() + ', latB: ' + destination.lat() + ',lngB: ' + destination.lng()); } }); } 没有复合赋值运算符(std::forward_list<T>::iterator)。但那为什么呢?

我问这个有三个原因:

  1. 这个操作员不会推进&#34;前进&#34;像operator+=这样的迭代器?
  2. 是否有帮助函数operator++()执行相同的操作?
  3. 我正在实施我自己的转发列表(用于学习),我想知道std::advance()的错误。

3 个答案:

答案 0 :(得分:9)

使用:

std::advance(it, n);

(在<iterator>中声明。)

重点是复合赋值运算符仅在运算具有O(1)成本时提供。由于递增前向迭代器具有线性成本,因此最好将其显式化。

如果您想要一个重复增量结果的新值,请使用:

auto it2 = std::next(it1, n);

答案 1 :(得分:5)

  

但我不知道为什么?

前向迭代器一次只能前进一个单位。 +=通常用于一次运行多个单元。

  

这个操作员不会推进&#34;前进&#34;像operator++()这样的迭代器?

但是你可以像iterator += 10那样使用它,这会让你相信它会立即提升10个位置。相反,它必须是10个单独的++次呼叫。

  

是不是还有帮助函数std :: advance()做同样的事情?

是的,但它明确指出它是多个++调用,除非您使用的是随机迭代器。

  

我正在实施我自己的转发列表(用于学习),我想知道operator + =()

的错误

您的迭代器应符合前向迭代器的标准定义。

答案 2 :(得分:1)

  

但我不知道为什么?

有一些合同,不同的类别迭代器必须遵循。可以找到说明here您可以查看ForwardIterator类别的合同,std::forward_list<T>::iterator所属的合同,以及RandomAccessIterator没有r += n操作