javascript

java

python

c#

android

node.js

reactjs

c++

php

html

jquery

css

.net

ios

git

ruby-on-rails

sql

c

string

ruby

可以表达lambda表达式的“类型”吗?

将lambda表达式视为可调用对象的“语法糖”,能否表达未命名的基础类型?

一个例子:

struct gt {
    bool operator() (int l, int r) {
        return l > r;
    }
} ;

现在,[](int l, int r) { return l > r; }是上述代码的优雅替代品(加上gt的可调用对象的必要创建),但是有没有办法表达gt(类型)本身呢?

一个简单的用法:

std::set<int, gt> s1;  // A reversed-order std::set
// Is there a way to do the same using a lambda?
std::set<int, some-magic-here-maybe([](int l, int r) { return l > r; }) > s2;
trans by 2020-01-18T21:38:58Z

指针-C ++在地图中插入unique_ptr

我有一个unique_ptr类型的C ++对象

typedef map<int64_t, std::unique_ptr<Class1>> ObjectArray;

unique_ptr创建为Class1类型的新对象并将其插入ObjectArray类型的对象的语法是什么?

trans by 2020-01-17T06:07:21Z

为什么std :: pair公开成员变量?

从[http://www.cplusplus.com/reference/utility/pair/],我们知道first具有两个成员变量secondgetFirst()

STL设计者为什么决定公开两个成员变量firstsecond,而不是提供getFirst()getSecond()

trans by 2020-01-16T16:17:00Z

C ++-std :: vector,默认构造,C ++ 11和重大更改

我今天遇到一个非常微妙的问题,我想请您发表意见。

考虑以下花园品种共享体习语类:

struct S
{
    S() : p_impl(new impl) {}
private:
    struct impl;
    boost::shared_ptr<impl> p_impl;
};

当您尝试通过以下方式将它们放入向量中时,会很有趣:

std::vector<S> v(42);

现在,至少使用MSVC 8,S中的所有元素都共享相同的n成员。 实际上,导致此问题的原因是vector构造函数:

template <typename T, typename A = ...>
class vector
{
    vector(size_t n, const T& x = T(), const A& a = A());
    ...
};

在场景下,仅默认构造了一个S对象,并从其中复制了vectorn元素。

现在,在C ++ 11中,有右值引用。 因此它不能像这样工作。 如果将S构造为

std::vector<S> v(42);

那么最有可能的是,实现可能会选择默认在向量内部构造S对象,因为复制构造可能不可用。 在这种情况下,这将是一个重大变化。

我的问题是:

  1. C ++ 03标准是否要求S必须具有上面定义的构造函数,即。 带有默认参数? 特别是,可以保证矢量对象的条目被复制而不是默认构造的吗?
  2. 关于这一点,C ++ 11标准怎么说?
  3. 我认为这是在C ++ 03和C + 11之间进行重大更改的可能性。 这个问题已经调查过了吗? 解决了 ?

PS:请不要对上面的类S的默认构造函数发表评论。 正是这种或实施某种形式的惰性构造。

trans by 2020-01-14T15:13:57Z

我如何按不同的std :: vector的值对std :: vector进行排序?

我有几个长度相同的std::vector。 我想对这些向量之一进行排序,并将相同的变换应用于所有其他向量。 有一个整齐的方法吗? (最好使用STL或Boost)? 一些向量包含ints,其中一些包含std::strings。

伪代码:

std::vector<int> Index = { 3, 1, 2 };
std::vector<std::string> Values = { "Third", "First", "Second" };

Transformation = sort(Index);
Index is now { 1, 2, 3};

... magic happens as Transformation is applied to Values ...
Values are now { "First", "Second", "Third" };
trans by 2020-01-14T13:50:44Z

C ++-从std :: cin读取密码

我需要从标准输入中读取密码,并希望std::cin不回显用户键入的字符...

如何禁用std :: cin的回声?

这是我当前正在使用的代码:

string passwd;
cout << "Enter the password: ";
getline( cin, passwd );

我正在寻找与操作系统无关的方法来执行此操作。这是在Windows和* nix中都可以执行此操作的方法。

trans by 2020-01-14T11:18:22Z

有一个sorted_vector类,它支持insert()等?

通常,使用排序后的std::vector而不是std::set更为有效。有人知道一个库类sorted_vector,该类基本上具有与std::set类似的接口,但是将元素插入排序后的向量中(这样就不会有重复项),使用 二进制搜索到find元素等?

我知道写起来并不难,但最好不要浪费时间并使用现有的实现。

更新:使用排序向量而不是集合的原因是:如果您有成千上万个包含仅10个左右成员的小集合,那么仅使用排序向量会更节省内存。

trans by 2020-01-12T10:52:49Z

stl-使用C ++ vector :: insert()添加到结尾

我正在编写一小段代码,根据矢量元素中的值,必须在某个位置将值插入C ++ STL矢量中。 我正在使用insert()函数来完成此操作。 我意识到,当我想在向量的末尾添加一个新元素时,我可以简单地使用push_back()。但是为了使我的代码看起来更好,我想专门使用insert(),它将迭代器指向 所需插入点和要插入的值之后的元素。 如果作为参数传入的迭代器的值为v.end()(其中v是我的向量),那么该工作原理是否与push_back()相同?

非常感谢!

trans by 2020-01-04T08:52:08Z

在C ++ std :: vector和C数组之间进行转换而无需复制

我希望能够在std :: vector及其基础C数组int *之间进行转换,而无需显式复制数据。

std :: vector是否提供对底层C数组的访问? 我正在寻找这样的东西

vector<int> v (4,100)
int* pv = v.c_array();

编辑:

另外,是否有可能做相反的事情,即我如何在不复制的情况下从C数组初始化std::vector

int pv[4] = { 4, 4, 4, 4};
vector<int> v (pv);
trans by 2020-01-03T07:55:53Z

为什么在函数上使用函子?

比较

double average = CalculateAverage(values.begin(), values.end());

double average = std::for_each(values.begin(), values.end(), CalculateAverage());

在函数上使用函子有什么好处? 第一个难道不是很容易阅读吗(甚至在添加实现之前)?

假设函子的定义如下:

class CalculateAverage
{
private:
   std::size_t num;
   double sum;
public:

   CalculateAverage() : num (0) , sum (0)
   {
   }

   void operator () (double elem) 
   {
      num++; 
      sum += elem;
   }

   operator double() const
   {
       return sum / num;
   }
};
trans by 2020-01-03T01:30:26Z

我想将std :: string转换为const wchar_t *

有什么办法吗?我的电脑是AMD64。

::std::string str;
BOOL loadU(const wchar_t* lpszPathName, int flag = 0);

当我使用时:

loadU(&str);

VS2005编译器说:

Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *'

我该怎么做?

trans by 2020-01-02T10:00:28Z

C ++-将元素插入特定位置

我想将元素插入向量的特定位置,我可以只使用赋值:

// vec1 and 2 have the same length & filled in somehow
vec1;
vec2;

vec1[i] = vec2[i] // insert vec2[i] at position i of vec1

或者我必须使用insert():

vector<sometype>::iterator iterator = vec1.begin();

vec1.insert(iterator+(i+1), vec2[i]);
trans by 2019-12-29T12:24:12Z

转换向量<T>到initializer_list <T>

每个人都从std::vector创建stl::initializer_list,但是反过来又如何呢?

例如。 如果您使用stl::initializer_list作为参数:

void someThing(std::initializer_list<int> items)
{
...
}

有时候,您将商品放在stl::initializer_list中而不是文字列表中:

std::vector<int> v;
// populate v with values
someThing(v); // boom! No viable conversion etc.

更为笼统的问题是:如何从可迭代的STL(而不仅仅是std::vector)创建stl::initializer_list

trans by 2019-12-27T08:17:30Z

c ++-std :: lower_bound和std :: upper_bound的原理?

STL提供二进制搜索功能std :: lower_bound和std :: upper_bound,但我倾向于不使用它们,因为我一直不记得它们在做什么,因为他们的合同对我来说完全是个谜。

只是看名字我猜想“ lower_bound”可能是“最后一个下限”的缩写,
即排序列表中的最后一个元素<=给定的val(如果有)。
同样,我猜“ upper_bound”可能是“第一个上限”的缩写,
也就是说,排序列表中的第一个元素> =给定的val(如果有)。

但是文档说,他们所做的事情与之不同-在我看来,这似乎是倒退和随机的混合。解释一下文档:
-lower_bound查找> = val的第一个元素
-upper_bound查找> val的第一个元素

因此,lower_bound根本找不到下界。 找到第一个上限!upper_bound查找第一个严格的上限。

这有意义吗??你怎么还记得

trans by 2019-12-25T14:09:04Z

c ++-一种将list <T>转换为vector <T>的衬里

是否有单线将list<T>转换为vector<T>

谷歌搜索返回了很多结果,这些结果需要人工进行冗长的转换,这让我感到恶心。 我们是否应该花那么大的麻烦去做像列表到矢量转换这样简单的事情?

trans by 2019-11-16T18:36:14Z

有没有一种很好的方法来将std :: minmax(a,b)分配给std :: tie(a,b)?

std::tie(a, b) = std::minmax(a, b);

我认为这是直观的代码。 干净易懂。 太糟糕了,它无法正常工作,因为if (a >= b) { std::swap(a, b); }if (a >= b) { std::swap(a, b); }模板。因此,如果在auto& a, auto& b内部交换值,则一个分配将覆盖另一个值:

auto[a, b] = std::make_pair(7, 5);

std::tie(a, b) = std::minmax(a, b);

std::cout << "a: " << a << ", b: " << b << '\n';

a:5,b:5

这里的预期输出是if (a >= b) { std::swap(a, b); }


我认为这很重要,因为实现转换功能以将功能应用到某些范围需要直观的lambda声明。 例如:

std::vector<int> v{ 0, 1, 0, 2, 0 };
std::vector<int> u{ 1, 0, 1, 0, 1 };

perform(v.begin(), v.end(), u.begin(), [](auto& a, auto& b){ 
    std::tie(a, b) = std::minmax(a, b);    
}); 

//v would be == {0, 0, 0, 0, 0}
//u would be == {1, 1, 1, 2, 1}

我发现的一种解决方案是在if (a >= b) { std::swap(a, b); }上显式构造if (a >= b) { std::swap(a, b); }而不使用任何引用限定符来强制执行副本:

std::tie(a, b) = std::tuple<int, int>(std::minmax(a, b)); 

但是,这种if (a >= b) { std::swap(a, b); }的冗余似乎很糟糕,尤其是在之前说过auto& a, auto& b时。


有没有一种不错的,简短的方法来执行此作业? 可能这是错误的方向,只是说if (a >= b) { std::swap(a, b); }是最好的方法吗?

trans by 2019-11-16T06:14:48Z

可以假设STL向量存储始终是连续的吗?

如果您有一个已调整大小的STL向量,是否可以安全地获取元素0的地址并假定其余向量将在内存中跟随?

例如

vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
trans by 2019-11-15T00:29:21Z

C ++-std :: string :: c_str()和临时

以下C ++代码格式正确吗:

void consumer(char const* p)
{
  std::printf("%s", p);
}

std::string random_string_generator()
{
  // returns a random std::string object
}

consumer(random_string_generator().c_str());

我遇到的问题是,在创建临时std :: string对象并采用c_str()指针后,没有什么可以防止std :: string对象被破坏(或者我错了吗?)。 即使代码一切正常,您能否将我指向标准? 当我使用g ++进行测试时,它确实可以工作。

trans by 2019-11-14T22:17:47Z

c ++-在一个s中合并多个set元素

我想知道是否有任何标准库或增强工具可以轻松地将多个集合的内容合并为一个集合。

就我而言,我有一些要合并的整数。

trans by 2019-11-13T06:46:49Z

C ++-std :: transform()和toupper(),没有匹配的函数

我试过这个问题的代码C ++ std :: transform()和toupper()..为什么会失败?

#include <iostream>
#include <algorithm>

int main() {
  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), std::back_inserter(out), std::toupper);
  std::cout << "hello in upper case: " << out << std::endl;
}

从理论上讲,它应该是Josuttis的书中的例子之一,但它并不能编译[http://ideone.com/aYnfv。]。

为什么GCC抱怨:

no matching function for call to ‘transform(
    __gnu_cxx::__normal_iterator<char*, std::basic_string
        <char, std::char_traits<char>, std::allocator<char> > >, 
    __gnu_cxx::__normal_iterator<char*, std::basic_string
        <char, std::char_traits<char>, std::allocator<char> > >, 
    std::back_insert_iterator<std::basic_string
        <char, std::char_traits<char>, std::allocator<char> > >,
    <unresolved overloaded function type>)’

我在这里想念什么吗? 与GCC有关的问题吗?

trans by 2019-11-11T03:16:45Z

1 2 3 4 5 6 7 8 下一页 共8页