std::transform
가장 관용적 인 방법이 될 것입니다. 당신은 기능 객체가 필요합니다
template<typename PairType>
struct Second
{
typename PairType::second_type operator()(PairType const& obj) const
{
return obj.second;
}
}
을 (. 당신이 std::map
또는 std::pair
를 사용하는 다른 것들로 많은 일을하는 경우, 당신은 당신의 도구 상자이있을 것이다) 그 후
를, 그것은 약간의 너는 오직 마지막 n만을 원하기 때문에 어색해.
std::vector<MyType>
extractLastN(std::map<double, MyType> const& source, size_t n)
{
std::vector<MyType> results;
std::transform(source.begin(), source.end(),
std::back_inserter(results),
Second<std::map<double, MyType>::value_type>());
if (results.size() > n) {
results.erase(results.begin(), results.end() - n);
}
return results;
}
:지도에 반복자는 임의 접근 반복자하지 않습니다, 그리고 당신이 를 추가하거나 임의의 값을 뺄 수 없기 때문에, 가장 간단한 솔루션은 모든 다음 원하지 않는 것들을 제거를 복사하는 것입니다
이것은 가장 효율적이지는 않지만 n
에 따라 다르며 이 사용 된 경우 충분할 수 있습니다. 당신이 여분의 복사, 등 (n
지도의 크기보다 일반적으로 더 작은 경우에만 아마 가치)를 피하려는 경우, 당신은해야 할 것이다 애호가 뭔가 :
std::vector<MyType>
extractLastN(std::map<double, MyType> const& source, ptrdiff_t n)
{
std::map<double, MyType>::const_iterator start
= source.size() <= n
? source.begin()
: std::prev(source.end(), n);
std::vector<MyType> results;
std::transform(start, source.end(),
std::back_inserter(results),
Second<std::map<double, MyType>::value_type>());
return results;
}
(있는 경우 당신이 C++ (11)에 대한 액세스 권한이없는, std::prev
는 단순히 :
template<typename IteratorType>
IteratorType
prev(IteratorType start, ptrdiff_t n)
{
std::advance(start, -n);
return start;
}
다시 말하지만, 당신이 표준 라이브러리와 함께 많은 일을하는 경우, 당신은 아마 이미 툴킷에 그것을 가지고)
'double'은지도에 대해 * 매우 * 나쁜 키 유형입니다. 부동 소수점 값의 정밀도 때문에 일반적으로 사용할 수 없게됩니다. – Xeo
@Xeo 의견을 보내 주셔서 감사합니다. "사용할 수 없다"는 것은 무엇을 의미합니까? –
글쎄, 당신이'map [13.37] = blargh;'라고 상상해보십시오. 예를 들어,'map [13.07 + 0.3]'또는'double d = 13.37; map [d] ...', 모든 숫자가 정확하게 부동 소수점 값으로 표현 될 수는 없으므로. Google은 "부동 소수점 부정확성"에 대한 추가 정보를 제공해야합니다. – Xeo