小编0x4*_*2D2的帖子

为什么std :: map重载运算符<不使用Compare

来自http://www.cplusplus.com/reference/map/map/operators/我注意到:

"请注意,这些操作都没有考虑任何容器的内部比较对象,而是直接比较元素(类型为value_type)."

这就是说重载的运算符"<" Compare在其声明中没有使用它(参见http://www.cplusplus.com/reference/map/map/)

std::map
template < class Key,                                     // map::key_type
           class T,                                       // map::mapped_type
           class Compare = less<Key>,                     // map::key_compare
           class Alloc = allocator<pair<const Key,T> >    // map::allocator_type
           > class map;
Run Code Online (Sandbox Code Playgroud)

其中,Compare

比较:二元谓词,它将两个元素键作为参数并返回一个bool.表达式comp(a,b),其中comp是这种类型的对象,a并且b是键值,如果在函数定义的严格弱顺序中a被认为是之前b的那个,则返回true .map对象使用这个表达式来确定元素在容器中遵循的顺序以及两个元素键是否相等(通过比较它们:它们是等效的!comp(a,b) && !comp(b,a)).如果地图容器中没有两个元素可以具有等效键.这可以是函数指针或函数对象(参见构造函数).默认为 less<T>,返回与应用less-than运算符相同 (a<b).别名为会员类型map::key_compare.

我不太明白,为什么不在Compare"<"运算符中使用?

c++ stl

8
推荐指数
1
解决办法
1346
查看次数

Ifstream - 重置EOF位

我正在和我一起工作ifstream.我读到EOF位置位(我需要这样).

那么为什么不这样做:

// IN is ifstream file. CH is char.

if (IN.eof()) {
    IN.seekg(ios::beg);
    IN.clear();

    if (read((char*)&CH, sizeof(CH)))
        cout << "Succes.";
    else
        cout << "Not S.";    
}
Run Code Online (Sandbox Code Playgroud)

这个read功能随时都没有成功.我尝试使用IN.setstate(ifstream::goodbit),而不是IN.clear()太多.但它是一样的,我是对的吗?

c++ ifstream eof

7
推荐指数
1
解决办法
5334
查看次数

通过引用传递数组?

我是C++的新手,我最近遇到了这个问题.

这段代码显然会起作用:

void setvalues(int *c, int *d)
{
    (*c) = 1;
    (*d) = 2;
}
int main()
{
    int a, b;
    setvalues(&a, &b);
    std::cout << a << b;
}
Run Code Online (Sandbox Code Playgroud)

那么为什么会返回错误呢?Visual C++ 2010错误:

C2664: 'setvalues' : cannot convert parameter 1 from 'int (*)[2]' to 'int *[]'

void setvalues(int *c[2], int *d[2])
{
   (*c[1]) = 1;
   (*d[1]) = 2;
}
int main()
{
    int a[2], b[2];
    setvalues(&a, &b);
    std::cout << a[1] << b[1];
}
Run Code Online (Sandbox Code Playgroud)

指向数组的指针有什么不同?我四处搜寻但没有运气.

c++ arrays pointers

7
推荐指数
1
解决办法
135
查看次数

C++字符串为什么不能用作char数组?

int main()
{    
    string a;

    a[0] = '1';
    a[1] = '2';
    a[2] = '\0';

    cout << a;
}
Run Code Online (Sandbox Code Playgroud)

为什么这段代码不起作用?为什么不打印字符串?

c++

7
推荐指数
2
解决办法
273
查看次数

尝试从元组中删除最后一个类型失败

我正在尝试删除元组的最后一个元素.当我在元组中只有一个元素要移除时,它可以工作.但是当我不止一个时,事情就出错了.我不明白为什么这不起作用.这些是我得到的错误:

prog.cpp:在函数' int main()':
prog.cpp:24:22:错误:不完整类型' remove_last<std::tuple<int, int> >'用于嵌套名称说明符
prog.cpp:24:22:错误:不完整类型' remove_last<std::tuple<int, int> >'用于嵌套名称说明符
prog.cpp :24:70:错误:模板参数1无效

#include <tuple>
#include <type_traits>

template <class T>
struct remove_last;

template <class T>
struct remove_last<std::tuple<T>>
{
    using type = std::tuple<>;
};

template <class... Args, typename T>
struct remove_last<std::tuple<Args..., T>>
{
    using type = std::tuple<Args...>;
};

int main()
{
    std::tuple<int, int> var;

    static_assert(
        std::is_same<remove_last<decltype(var)>::type,
        std::tuple<int>>::value, "Values are not the same"
    );
}
Run Code Online (Sandbox Code Playgroud)

当我在其中一个特化中使模板参数非变量时,错误消失了.但后来这变成了一个专门化,它只会处理一个有两个元素的元组 - 而不是我的目标.如何使用可变参数进行此操作?换句话说,当元组中有多个元素时,如何才能使它工作?

c++ templates variadic-templates c++11

7
推荐指数
1
解决办法
1151
查看次数

从'int'类型的临时类型初始化'int&'类型的非const引用

#include<iostream>
using namespace std;

int fun(int &x)
{
    return x;
}
int main()
{
    cout << fun(10);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释错误的原因吗?

谢谢

c++ reference temporary rvalue lvalue

7
推荐指数
2
解决办法
3万
查看次数

将参数包解压缩到另一个模板声明中意味着什么?

我不明白应该如何使用以下功能.当我打电话时A::f我可以省略模板参数,但我不明白为什么.

template <typename... Args>
struct A
{
    template <Args...>
    void f() {}
};

int main()
{
    A<int, bool> a;
    a.f();
}
Run Code Online (Sandbox Code Playgroud)

具体来说,这是什么template <Args...>意思,为什么我可以将模板参数从函数调用中删除f

c++ c++11

7
推荐指数
1
解决办法
288
查看次数

MSVCs实现std :: put_time

我正在使用Microsoft Visual Studio 2012,并且正在查看使用std::put_time,因此我创建了以下示例:

int main()
{
    std::time_t t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());

    std::locale::global( std::locale("en-GB") );

    std::cout << std::put_time( std::localtime( &t ), "%x" ) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

06/25/2013
Run Code Online (Sandbox Code Playgroud)

这不是我期望从en-GB语言环境中获得的日期格式.我也尝试过:

std::cout.imbue( std::locale("en-GB") );
Run Code Online (Sandbox Code Playgroud)

但同样,输出相同.这是我应该为这个语言环境获取的输出,还是我在某个地方犯了错误?

c++ locale standard-library c++11 visual-studio-2012

7
推荐指数
1
解决办法
972
查看次数

在std :: list中查找所有匹配的元素

我想知道是否有任何内置或完善的方式(即通过lambda)来浏览std :: list的元素并找到所有匹配给定值的元素?我知道我可以遍历所有这些,但我想我会问是否有办法让迭代器只迭代符合给定条件的元素?我下面的示例只给出了第一个匹配元素的迭代器.

#include <list>
#include <algorithm>
#include <stdio.h>

int main()
{
    std::list<int> List;
    List.push_back(100);
    List.push_back(200);
    List.push_back(300);
    List.push_back(100);
    int findValue = 100;

    auto it = std::find_if(List.begin(), List.end(), [findValue](const int value)
    {
        return (value == findValue);
    });

    if (it != List.end())
    {
        for (; it != List.end(); ++it)
        {
            printf("%d\n", * it);
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

感谢您的任何反馈.

c++ stdlist c++11

7
推荐指数
3
解决办法
3万
查看次数

std :: size的大小为零的数组

std::array<int,0>大小为零的数组是什么意思?

在发布之前我已经在SO中经历了类似的问题,所有这些问题都是关于简单的数组类型和C语言,并且大多数人都认为这是非法的.但是在C++中array<int,0>是允许的.

根据cppreference.com

零长度数组(N == 0)有一种特殊情况.在那种情况下,array.begin() == array.end()这是一些独特的价值.调用front()back()对零大小的数组的影响是未定义的.

为什么不将它定义为非法?

c++ stdarray

7
推荐指数
1
解决办法
637
查看次数