从C++11开始,您可以编写以下内容
#include <vector>
#include <string>
struct S
{
S(int x, const std::string& s)
: x(x)
, s(s)
{
}
int x;
std::string s;
};
// ...
std::vector<S> v;
// add new object to the vector v
// only parameters of added object's constructor are passed to the function
v.emplace_back(1, "t");是否有类似于容器类( C# )的C++函数(如emplace或emplace_back )的emplace模拟?
更新:在C#中类似的代码可能被写成list.EmplaceBack(1, "t");而不是list.Add(new S(1, "t"));。最好不要记住类名,每次都在这种情况下编写new ClassName。
发布于 2016-03-14 15:14:45
您可以通过扩展来稍微改进@Boo变体。
您可以使用Activator.CreateInstance创建对象实例,从而使解决方案更加通用。
public static class ListExtension
{
public static void Emplace<S>(this IList<S> list, params object[] parameters)
{
list.Add((S)Activator.CreateInstance(typeof(S), parameters));
}
}注意:未选中类型和计数参数,因此,如果您做了错误的事情,您只会在运行时出现错误。
发布于 2016-03-14 11:26:59
一般来说,在C#中没有类似的东西,它的需求也比C++少得多。
在C#中,当您有一个List<SomeReferenceType>时,您真正拥有的是一个List<ReferenceToSomeType>,所以是一个引用列表,每个元素的大小为4或8个字节(参见.NET中的对象引用有多大?)。复制引用不会导致基础对象被复制,因此它非常快(您正在复制大约4或8个字节,并且处理器是针对此操作进行优化的,因为这是处理器的本机指针的大小)。因此,当您someList.Add(someReference)时,您要做的是向您的List<>添加一个引用。
在C++中,当您有一个std::vector<SomeType>时,您拥有的是一个SomeType向量,每个元素的大小等于sizeof(SomeType)。在std::vector<>中插入一个新元素将导致要插入的元素被复制(克隆、复制.选择一个你喜欢的动词)。这是个昂贵的手术。
通常,您使用的模式是创建一个对象,以便将其插入到std::vector<>中。为了在C++11中优化这个操作,他们增加了两种方法:std::vector<>::emplace方法和std::vector<>对移动语义的支持。不同之处在于,移动语义必须由SomeType类型支持(您需要一个带有noexcept说明符的移动构造函数),而每个类型都支持emplace (最终只使用放置构造函数)。
发布于 2016-03-14 11:24:04
在c#中,您可以使用扩展方法来实现您想要的
public static class ListExtension
{
public static void Emplace(this IList<S> list, int x, string s)
{
list.Add(new S(x, s));
}
}那就像这样用吧
myList.Emplace(1,"t");https://stackoverflow.com/questions/35985797
复制相似问题