C++11 - 元组向量
C++11 - vector of tuples
我创建了一个类型
using Parameter = std::tuple<unsigned int, std::string>;
而在我的class中,我有一个像这样的属性(注意:矢量,unique_ptr和字符串都包括在内 - 没有问题)
class MyClass
{
public:
std::vector<std::unique_ptr<Parameter>> parameters;
public:
explicit MyClass(const std::vector<std::string> &data);
};
有定义
MyClass::MyClass(const std::vector<std::string> &data){
for (int i = 0; i < data.size(); i += 2) {
this->parameters.insert(
std::unique_ptr<Parameter>(
static_cast<unsigned int>(std::stoi(data[i])),
std::string(data[i + 1])
)
);
}
}
编译器的结果:
error: no matching function for call to ‘std::vector<std::tuple<unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::insert(semac::command::Parameter)’
所以我的问题是:有没有像我在代码中尝试的那样创建 using MyTuple = std::tuple<...>;
实例的方法?一般来说,执行此操作的最佳方法是什么?
(我创建答案只是为了回答这个问题)
正如 Igor Tandetnik 和一些程序员所说,正确的方法是使用 std::make_unique
或 std::unique_ptr<Parameter>(new Parameter(static_cast<unsigned int>(std::stoi(data[i])), data[i + 1]))
最终代码可能如下所示:
MyClass::MyClass(const std::vector<std::string> &data){
for (int i = 0; i < data.size(); i += 2) {
this->parameters.push_back(std::unique_ptr<Parameter>(new Parameter(static_cast<unsigned int>(std::stoi(data[i])), data[i + 1])));
}
}
正如 user6386155 提到的,可以使用 emplace_back 方法 (std::vector::emplace_back) 来完成。
MyClass::MyClass(const std::vector<std::string> &data){
for (int i = 0; i < data.size(); i += 2) {
this->parameters.emplace_back(new Parameter(static_cast<unsigned int>(std::stoi(data[i])), data[i + 1]));
}
}
另外小心使用CLionIDE(2017.2.1),有bug
我因此很困惑。
我创建了一个类型
using Parameter = std::tuple<unsigned int, std::string>;
而在我的class中,我有一个像这样的属性(注意:矢量,unique_ptr和字符串都包括在内 - 没有问题)
class MyClass
{
public:
std::vector<std::unique_ptr<Parameter>> parameters;
public:
explicit MyClass(const std::vector<std::string> &data);
};
有定义
MyClass::MyClass(const std::vector<std::string> &data){
for (int i = 0; i < data.size(); i += 2) {
this->parameters.insert(
std::unique_ptr<Parameter>(
static_cast<unsigned int>(std::stoi(data[i])),
std::string(data[i + 1])
)
);
}
}
编译器的结果:
error: no matching function for call to ‘std::vector<std::tuple<unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::insert(semac::command::Parameter)’
所以我的问题是:有没有像我在代码中尝试的那样创建 using MyTuple = std::tuple<...>;
实例的方法?一般来说,执行此操作的最佳方法是什么?
(我创建答案只是为了回答这个问题)
正如 Igor Tandetnik 和一些程序员所说,正确的方法是使用 std::make_unique
或 std::unique_ptr<Parameter>(new Parameter(static_cast<unsigned int>(std::stoi(data[i])), data[i + 1]))
最终代码可能如下所示:
MyClass::MyClass(const std::vector<std::string> &data){
for (int i = 0; i < data.size(); i += 2) {
this->parameters.push_back(std::unique_ptr<Parameter>(new Parameter(static_cast<unsigned int>(std::stoi(data[i])), data[i + 1])));
}
}
正如 user6386155 提到的,可以使用 emplace_back 方法 (std::vector::emplace_back) 来完成。
MyClass::MyClass(const std::vector<std::string> &data){
for (int i = 0; i < data.size(); i += 2) {
this->parameters.emplace_back(new Parameter(static_cast<unsigned int>(std::stoi(data[i])), data[i + 1]));
}
}
另外小心使用CLionIDE(2017.2.1),有bug
我因此很困惑。