У меня есть сценарий использования, подобный приведенному ниже фрагменту кода, использование map::find
в карте, возвращаемой геттером, чтобы найти несуществующий ключ, фактически нашло бы итератор, первое значение которого является размером карты (вероятно), поэтому не ведет себя, как ожидалось, равно map::end
это, вероятно, из-за того, что моя карта была получателем возвращенной карты. И потреблял карту, не назначая ее переменной. Чтобы возвращаемое значение получателя могло быть немедленно уничтожено.
- Так что, если мое предположение верно?
- Почему он вернул размер карты вместо конечного итератора?
#include <iostream>
#include <map>
class B {
long long id_;
public:
B() = default;
explicit B(long long);
~B() = default;
};
B::B(long long int id) : id_(id) {}
class A {
std::string id_;
std::map<long long, std::shared_ptr<B>> b_;
public:
A() = default;
explicit A(std::string id);
~A() = default;
const std::string &id() const;
std::map<long long, std::shared_ptr<B>> b();
};
A::A(std::string id): id_(id) {
b_[1] = std::make_shared<B>(1);
b_[2] = std::make_shared<B>(2);
}
const std::string &A::id() const {
return id_;
}
std::map<long long, std::shared_ptr<B>> A::b() {
return b_;
}
int main() {
std::shared_ptr<A> a = std::make_shared<A>("arst");
if (a->b().find(3) != a->b().end()) {
std::cout << a->b().find(3)->first << std::endl;
std::cout << a->b().at(3) << std::endl;
}
}
запустить как показано ниже:
clang --version
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
с выводом:
clang++ test.cc -std=c++11
./a.out
2
libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: map::at: key not found
[1] 64348 abort ./a.out